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
相关产品推荐
相关产品推荐

