繁体   English   中英

将 pyspark 数据框中的两列转换为一个 python 字典

[英]Convert two columns in pyspark dataframe into one python dictionary

我有一个 pyspark 数据框,我想在其中使用它的两列来输出字典。

输入 pyspark 数据框:

col1|col2|col3
v   |  3 | a
d   |  2 | b
q   |  9 | g

输出:

dict = {'v': 3, 'd': 2, 'q': 9}

我应该如何有效地做到这一点?

我相信你可以通过将 DF(只有你想要的两列)转换为 rdd 来实现它:

data_rdd = data.selet(['col1', 'col2']).rdd

创建一个包含键的 rdd,使用 rdd.map 函数与两列配对:

kp_rdd = data_rdd.map(lambda row : (row[0],row[1]))

然后收集为地图:

dict = kp_rdd.collectAsMap()

这是主要思想,抱歉,我现在没有运行 pyspark 的实例来测试它。

给定您的示例,在选择适用的列并转换为 rdd 之后, collectAsMap将完成所需的字典,而无需任何其他步骤:

df.select('col1', 'col2').rdd.collectAsMap()

这里有几个不同的选项,具体取决于所需的格式...检查一下...我正在使用结构化 api...如果您需要坚持,则另存为 json dict 或使用 parquet 保留模式

from pyspark.sql.functions import to_json
from pyspark.sql.functions import create_map
from pyspark.sql.functions import col

df = spark\
.createDataFrame([\
    ('v', 3, 'a'),\
    ('d', 2, 'b'),\
    ('q', 9, 'g')],\
    ["c1", "c2", "c3"])

mapDF = df.select(create_map(col("c1"), col("c2")).alias("mapper"))
mapDF.show(3)

+--------+
|  mapper|
+--------+
|[v -> 3]|
|[d -> 2]|
|[q -> 9]|
+--------+

dictDF = df.select(to_json(create_map(col("c1"), col("c2")).alias("mapper")).alias("dict"))
dictDF.show()

+-------+
|   dict|
+-------+
|{"v":3}|
|{"d":2}|
|{"q":9}|
+-------+

keyValueDF = df.selectExpr("(c1, c2) as keyValueDict").select(to_json(col("keyValueDict")).alias("keyValueDict"))
keyValueDF.show()

+-----------------+
|     keyValueDict|
+-----------------+
|{"c1":"v","c2":3}|
|{"c1":"d","c2":2}|
|{"c1":"q","c2":9}|
+-----------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM