PySpark无法将dicts的RDD转换为DataFrame。错误:无法接受类型<class'中的对象pyspark.sql.types.row'=“”>

时间:2016-11-26 14:36:14

标签: python apache-spark pyspark apache-spark-sql

我目前正在使用Spark 1.4.1并且无法将带有嵌套字典的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在共享资源上,所以我需要找到一个解决方法:(。任何如果提前感谢,将不胜感激!

1 个答案:

答案 0 :(得分:3)

这是因为Spark 1.4中不接受RowStructType。接受的类型是:

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")