![](/img/trans.png)
[英]Convert the dictionary to data frame in pyspark for unicode key and list of float values
[英]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.