PySpark中用通配符匹配FK_前缀列实现列转行的方法
PySpark外键列宽转长实现方案
你需要的转置操作属于典型的宽表转长表场景,直接用PySpark内置的array+explode函数组合即可实现,无需复杂的自定义逻辑:
核心实现步骤
- 筛选两类列:所有以
FK_开头的外键列、其余非外键列 - 将所有外键列打包为数组,再通过
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
相关产品推荐
相关产品推荐

