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

PySpark中用通配符匹配FK_前缀列实现列转行的方法

PySpark外键列宽转长实现方案

你需要的转置操作属于典型的宽表转长表场景,直接用PySpark内置的array+explode函数组合即可实现,无需复杂的自定义逻辑:


核心实现步骤

  1. 筛选两类列:所有以FK_开头的外键列、其余非外键列
  2. 将所有外键列打包为数组,再通过explode将数组元素拆分为独立行

完整可运行代码

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

# 初始化Spark会话
spark = SparkSession.builder.appName("FkTranspose").getOrCreate()

# ---------------- 示例输入构造,你可以替换为自己的数据源读取逻辑 ----------------
data = [
    (1, "Alpha", "ABC", 101, 102, 103),
    (2, "Bravo", "CDE", 104, 105, 106)
]
schema = ["id", "name", "dept", "FK_column1", "FK_column2", "FK_column3"]
df = spark.createDataFrame(data, schema)

# ---------------- 核心转置逻辑 ----------------
# 筛选外键列和非外键列
fk_cols = [col for col in df.columns if col.startswith("FK_")]
non_fk_cols = [col for col in df.columns if not col.startswith("FK_")]

# 打包外键列为数组后炸开为行
result_df = df.select(
    *non_fk_cols,
    F.explode(F.array(*fk_cols)).alias("foreign_keys")
)

# 输出验证结果
result_df.show()

结果输出

运行后将得到你需要的格式:

+---+-----+----+------------+
| id| name|dept|foreign_keys|
+---+-----+----+------------+
|  1|Alpha| ABC|         101|
|  1|Alpha| ABC|         102|
|  1|Alpha| ABC|         103|
|  2|Bravo| CDE|         104|
|  2|Bravo| CDE|         105|
|  2|Bravo| CDE|         106|
+---+-----+----+------------+

特殊场景适配

如果外键列存在空值,不需要生成空值行的话,将explode替换为explode_outer后增加过滤逻辑即可:

result_df = df.select(
    *non_fk_cols,
    F.explode_outer(F.array(*fk_cols)).alias("foreign_keys")
).filter(F.col("foreign_keys").isNotNull())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:06:01