我正在尝试在 pySpark 1.6.1 中动态构建一行,然后将其构建到数据框中。总体思路是将 describe
的结果扩展为包括例如偏斜和峰度。这是我认为应该起作用的方法:
from pyspark.sql import Row
row_dict = {'C0': -1.1990072635132698,
'C3': 0.12605772684660232,
'C4': 0.5760856026559944,
'C5': 0.1951877800894315,
'C6': 24.72378589441825,
'summary': 'kurtosis'}
new_row = Row(row_dict)
但这会返回 TypeError: sequence item 0: expected string, dict found
这是一个相当明显的错误。然后我发现如果我先定义 Row 字段,我可以使用字典:
r = Row('summary', 'C0', 'C3', 'C4', 'C5', 'C6')
r(row_dict)
> Row(summary={'summary': 'kurtosis', 'C3': 0.12605772684660232, 'C0': -1.1990072635132698, 'C6': 24.72378589441825, 'C5': 0.1951877800894315, 'C4': 0.5760856026559944})
这将是一个很好的步骤,但我似乎无法动态指定 Row
中的字段。我需要它来处理未知数量的未知名称的行。根据文档,您实际上可以采用另一种方式:
>>> Row(name="Alice", age=11).asDict() == {'name': 'Alice', 'age': 11}
True
看来我应该能够做到这一点。似乎旧版本中可能有一些已弃用的功能允许这样做,例如 here .有没有更新的等价物我错过了?
最佳答案
您可以使用关键字参数解包如下:
Row(**row_dict)
## Row(C0=-1.1990072635132698, C3=0.12605772684660232, C4=0.5760856026559944,
## C5=0.1951877800894315, C6=24.72378589441825, summary='kurtosis')
需要注意的是 internally sorts data by key联系地址problems with older Python versions .
此行为可能会在即将发布的版本中删除 - 请参阅 SPARK-29748 删除 PySpark SQL 行创建中的字段排序。删除后,您必须确保 dict
中值的顺序在记录之间保持一致。
关于python - 从 pySpark 中的 dict 构建一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38253385/