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



我有一个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 字典或使用 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}|
+-----------------+

最新更新