将标准python键值字典列表转换为pyspark data fram

2024-05-16 23:17:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 [{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]

如何使用以下构造来执行此操作?

df = sc.parallelize([
    ...
]).toDF

将arg1 arg2放在上述代码中的位置(…)


Tags: 数据代码df列表字典colpyspark键值
3条回答

对于那些想找到不同解决方案的人,我发现这对我很有效: 我有一个带键值对的字典-我想把它转换成两个PySpark dataframe列:

所以

{k1:v1, k2:v2 ...}

变成

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

lol= list(map(list, mydict.items()))
df = spark.createDataFrame(lol, ["col1", "col2"])

为了让它在运行Spark 2.0的python2.7中为我工作,我不得不修改接受的答案。

from collections import OrderedDict
from pyspark.sql import SparkSession, Row

spark = (SparkSession
        .builder
        .getOrCreate()
    )

schema = StructType([
    StructField('arg1', StringType(), True),
    StructField('arg2', StringType(), True)
])

dta = [{"arg1": "", "arg2": ""}, {"arg1": "", "arg2": ""}]

dtaRDD = spark.sparkContext.parallelize(dta) \
    .map(lambda x: Row(**OrderedDict(sorted(x.items()))))

dtaDF = spark.createDataFrame(dtaRdd, schema) 

老办法:

sc.parallelize([{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}]).toDF()

新方法:

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()

相关问题 更多 >