python - 从 pySpark 中的 dict 构建一行

标签 python apache-spark pyspark

我正在尝试在 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/

相关文章:

python - 我正在尝试从 Django 内运行一个无尽的工作线程(守护进程)

python - 显示每月 DataFrame 的前 5 个最大值

postgresql - 对索引位集进行大量更新的最佳方法

python - ARIMA 模型的逆平稳性

java - 如何从行值创建新列

scala - 如何在 Apache ignite 中缓存 Dataframe

amazon-web-services - AWS 胶水 : How to add a column with the source filename in the output?

python - PySpark DataFrames - 使用不同类型的列之间的比较进行过滤

amazon-s3 - 使用 Pyspark 3.2.1 + hadoop 3.3.2 确定写入的对象路径

python - 从 python 脚本获取 "OperationalError: 1366"- MySQL 5.6。 MySQLdb 1.2.3