将标准python键值字典列表转换为pyspark数据帧

sta*_*kit 13 python dictionary apache-spark pyspark

考虑我有一个python字典键值对列表,其中键对应于表的列名,所以对于下面的列表如何将其转换为具有两个列arg1 arg2的pyspark数据帧?

 [{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]
Run Code Online (Sandbox Code Playgroud)

我如何使用以下构造来做到这一点?

df = sc.parallelize([
    ...
]).toDF
Run Code Online (Sandbox Code Playgroud)

在上面的代码中放置arg1 arg2的位置(...)

652*_*3ca 29

旧方式:

sc.parallelize([{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]).toDF()
Run Code Online (Sandbox Code Playgroud)

新方法:

from pyspark.sql import Row
from collections import OrderedDict

def convert_to_row(d: dict) -> Row:
    return Row(**OrderedDict(sorted(d.items())))

sc.parallelize([{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]) \
    .map(convert_to_row) \ 
    .toDF()
Run Code Online (Sandbox Code Playgroud)

  • 这不是scala吗?def convert_to_row(d:dict) - >行: (3认同)
  • @rado 这是一个 Python 3 函数注释。 (2认同)

小智 10

对于任何寻找不同解决方案的人,我发现这对我有用:我有一个带有键值对的字典 - 我希望将其转换为两个 PySpark 数据框列:

所以

{k1:v1, k2:v2 ...}
Run Code Online (Sandbox Code Playgroud)

成为

 ---------------- 
| col1   |  col2 |
|----------------|
| k1     |  v1   |
| k2     |  v2   |
 ----------------

lol= list(map(list, mydict.items()))
df = spark.createDataFrame(lol, ["col1", "col2"])
Run Code Online (Sandbox Code Playgroud)

  • 更简单: ```df = Spark.createDataFrame(mydict.items(), ["col1", "col2"]) ``` (6认同)
  • 谢谢这对我有帮助! (2认同)

Bre*_*dan 4

其他答案都有效,但这里还有一个适用于嵌套数据的单行代码。它可能不是最有效的,但是如果您从内存中的字典创建 DataFrame,那么您要么正在使用测试数据等小数据集,要么错误地使用了 Spark,因此效率实际上不应该成为问题:

d = {any json compatible dict}
spark.read.json(sc.parallelize([json.dumps(d)]))
Run Code Online (Sandbox Code Playgroud)