我正在尝试在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字段,我可以使用dict:
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。我缺少一个更新的等价物吗?
答案 0 :(得分:28)
您可以按如下方式使用关键字参数解压缩:
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。
答案 1 :(得分:2)
如果dict没有变平,你可以递归地将dict转换为Row。
belongs_to :results, Webservices.TestResult