我试图在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。谢谢