我目前正在使用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'>
我不确定为什么会收到此错误。以下是对象rdd
和schema
:
>>> 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
在共享资源上,所以我需要找到一个解决方法:(。任何如果提前感谢,将不胜感激!
答案 0 :(得分:3)
这是因为Spark 1.4中不接受Row
为StructType
。接受的类型是:
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")