我有一个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}|
+-----------------+