繁体   English   中英

PySpark无法将字典的RDD转换为DataFrame。 错误:无法接受类型中的对象 <class 'pyspark.sql.types.Row'>

[英]PySpark can't convert RDD of dicts to DataFrame. Error: can not accept object in type <class 'pyspark.sql.types.Row'>

我目前正在使用Spark 1.4.1,无法将带有嵌套dict的dict转换为Spark DataFrame 我将嵌套的dict转换为Row ,但是它似乎不接受我的架构。

这是重现我的错误的代码:

from pyspark.sql import Row, SQLContext, types as pst
sqlContext = SQLContext(sc)

example_dict = Row(**{"name": "Mike", "data": Row(**{"age": 10, "like": True})})

example_rdd = sc.parallelize([example_dict])

nested_fields = [pst.StructField("age", pst.IntegerType(), True), 
                 pst.StructField("like", pst.BooleanType(), True)]

schema = pst.StructType([
               pst.StructField("data", pst.StructType(nested_fields), True),
               pst.StructField("name", pst.StringType(), True)
])

df = sqlContext.createDataFrame(example_rdd, schema)

TypeError: StructType(List(StructField(age,IntegerType,true),StructField(like,BooleanType,true))) can not accept object in type <class 'pyspark.sql.types.Row'>

我不确定为什么会收到此错误。 这是对象rddschema

>>> example_rdd.first()
Row(data=Row(age=10, like=True), name='Mike')

>>> schema
StructType(List(StructField(data,StructType(List(StructField(age,IntegerType,true),StructField(like,BooleanType,true))),true),StructField(name,StringType,true)))

我不确定是否丢失了某些内容,但似乎该架构与该对象匹配。 为什么Spark 1.4.1不会接受“行内”行?

请注意:这在Spark 2.0.2不是问题,但是不幸的是,我正在使用Spark 1.4.1共享资源,因此我暂时需要解决:(。任何帮助,提前致谢!

这是因为Row不接受StructType在星火1.4。 可接受的类型为:

pst._acceptable_types[pst.StructType]
(tuple, list)

和Spark天真地检查:

type(obj) not in _acceptable_types[_type]

这显然不适用于Row对象。 等同于当前版本中发生的情况的正确条件是:

isinstance(obj, _acceptable_types[_type])

如果要使用嵌套列,则可以使用普通的Python tuple

Row(**{"name": "Mike", "data": (10, True)})

要么

((10, True), "Mike")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM