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

将标准python键值字典列表转换为pyspark数据帧,python,dictionary,apache-spark,pyspark,Python,Dictionary,Apache Spark,Pyspark,假设我有一个python字典键值对的列表,其中键对应于表的列名,所以对于下面的列表,如何将其转换为带有两个col arg1 arg2的pyspark数据帧 [{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""},{"arg1": "", "arg2": ""}] 如何使用以下构造来完成此操作 df = sc.parallelize([ ... ]).toDF 在上述代码(…)中放置arg1 arg2的位置旧式: sc.paralleli

假设我有一个python字典键值对的列表,其中键对应于表的列名,所以对于下面的列表,如何将其转换为带有两个col 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()

我必须修改已接受的答案,以便在运行Spark 2.0的Python 2.7中使用它

从集合导入订单数据
从pyspark.sql导入SparkSession,第行
火花=(火花会话)
建设者
.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(已排序(x.items())))
dtaDF=spark.createDataFrame(dtaRdd,模式)

对于任何寻求不同解决方案的人,我发现这对我来说很有效: 我有一个带有键值对的字典-我想将其转换为两个PySpark dataframe列:

所以

变成

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

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

假设您的数据是一个结构,而不是一个字符串字典,您可以这样做

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

您应该编辑您的问题,而不是“…”请告诉我们“arg1”和“arg2”应该放在哪里。@betterworld好的,完成了如何dothanks,您能回答相关问题吗:这不是scala吗?def convert_to_row(d:dict)->row:@rado这是一个Python 3函数注释。@Andre85我认为,因为每个字典中键的顺序可能不同,所以我们需要排序。如果缺少键,会发生什么情况,我们会得到空值还是错误。这并没有回答本页上提出的问题谢谢这帮助了我!
newdf = df.select(['df.arg1','df.arg2'])