PySpark无法从架构和具有无序字段的行创建DataFrame

时间:2019-02-08 14:20:04

标签: python apache-spark dataframe pyspark

我试图在PySpark的Row()中添加一个字段,首先调用Row()。toDict(),以便我可以添加更多字段(因为Row是一个元组且是不可变的)。我保存架构以添加新字段。基本代码示例就是这样。我删除了字段添加/删除代码,因为即使没有字段操作也存在错误:

row_list = dataframe.collect()
row_result = []

for row in row_list:
  # row example: Row(b="hello", a=datetime.datetime(...), c=1289)
  row = Row(**row.toDict())
  # resulting row: Row(a=datetime.datetime(...), b="hello", c=1289)
  row_result.append(row)


spark.createDataFrame(row_result, schema=dataframe.schema) 
# this fails!
# spark tries to convert 'hello' to TimestampType

基本上,toDict()是这里有问题的函数。它需要一个Row并返回包含有序字段的字典,因此当我生成新的Row(** dict)时,它将具有不同的字段顺序。即使模式是由字段名称定义的,它也会尝试按位置分配类型,因此,如果我的旧字段#3是TimestampField,而新的有序行具有StringType,则它将失败。我使用的是Spark 2.1和Python 3.6。谢谢

0 个答案:

没有答案