You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyspark DataFrame不转pandas实现多列转map值单列如何操作

实现方案

你可以使用PySpark原生的create_map函数实现需求,全程不会触发pandas转换,适合任意规模的数据量处理。

核心思路

create_map函数接收交替传入的键、值参数,我们只需要将目标列的列名作为键(需用lit转成Spark字面量)、对应列的值作为值传入,即可生成Map类型的列。

完整实现代码

from pyspark.sql import SparkSession
from pyspark.sql import functions as F

# 初始化SparkSession
spark = SparkSession.builder.appName("col_to_map").getOrCreate()

# 构造和示例一致的测试DataFrame,id列对应原表行标识A、B
data = [("A", 1, 2), ("B", 4, 2)]
df = spark.createDataFrame(data, schema=["id", "a", "b"])

# 构造Map列表达式,自动遍历目标列生成键值对
target_cols = ["a", "b"]
map_params = []
for col_name in target_cols:
    map_params.append(F.lit(col_name))
    map_params.append(F.col(col_name))
value_col = F.create_map(*map_params).alias("value")

# 生成结果DataFrame,保留行标识+value列
result_df = df.select("id", value_col)

# 打印查看结果
result_df.show(truncate=False)

运行输出

+---+----------------+
|id |value           |
+---+----------------+
|A  |{a -> 1, b -> 2}|
|B  |{a -> 4, b -> 2}|
+---+----------------+

补充说明

如果你需要输出JSON字符串格式的value(和你示例里的{a : 1, b : 2}格式完全对齐),可以用to_json函数包裹create_map的结果:

value_col = F.to_json(F.create_map(*map_params)).alias("value")

修改后输出为:

+---+--------------+
|id |value         |
+---+--------------+
|A  |{"a":1,"b":2} |
|B  |{"a":4,"b":2} |
+---+--------------+

如果需要调整包含的列,只需要修改target_cols列表即可,不需要修改其他逻辑。

内容的提问来源于stack exchange,提问作者KSAITHE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:36:02