簡體   English   中英

將標准 python 鍵值字典列表轉換為 pyspark 數據框

[英]Convert a standard python key value dictionary list to pyspark data frame

考慮我有一個 python 字典鍵值對列表,其中鍵對應於表的列名,因此對於下面的列表,如何將其轉換為帶有兩個 cols arg1 arg2 的 pyspark 數據框?

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

我如何使用以下構造來做到這一點?

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

上面代碼中 arg1 arg2 的位置(...)

舊方式:

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

對於任何尋找不同解決方案的人,我發現這對我有用:我有一個帶有鍵值對的字典 - 我希望將其轉換為兩個 PySpark 數據框列:

所以

{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 的 Python 2.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) 

假設您的數據是結構而不是字符串字典,您可以這樣做

newdf = df.select(['df.arg1','df.arg2'])

其他答案有效,但這里還有一個適用於嵌套數據的單行。 它可能不是最有效的,但如果你從內存字典中創建一個 DataFrame,你要么使用像測試數據這樣的小數據集,要么錯誤地使用 spark,所以效率真的不應該是一個問題:

d = {any json compatible dict}
spark.read.json(sc.parallelize([json.dumps(d)]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM