
[英]How to convert type <class 'pyspark.sql.types.Row'> into Vector
[英]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'>
我不确定为什么会收到此错误。 这是对象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
共享资源,因此我暂时需要解决:(。任何帮助,提前致谢!
这是因为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.