在 PySpark 中使用通配符列名称将 Spark Dataframe 列转为行

Pivot Spark Dataframe Columns to Rows with Wildcard column Names in PySpark

我正在尝试将带有外键的列的 spark Dataframe 旋转到另一个 table。所有此类列名都以 FK_<column_name> 开头。这样的列数可以是1个或多个。

我希望能够将列名称以 FK_ 开头的所有列转换为一列中的行,以便我可以与另一列 table 连接。我不需要另一列中的列名称,但如果数据透视操作这样做也很好。

例子table我有

id     name     dept      FK_column1      FK_column2     FK_Column3
1     Alpha     ABC       101             102            103
2     Bravo     CDE       104            105           106

我正在寻找的输出

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

您可以获得名称以 FK_ 开头的列的列表并构建 stack expression to 数据框:

fk_cols = [c for c in df.columns if c.startswith("FK_")]

stack_expr = f"stack({len(fk_cols)}," + ','.join(
    [f"'{c.replace('FK_', '')}',{c}" for c in fk_cols]
) + ") as (FK, foreign_keys)"

df.selectExpr("id", "name", "dept", stack_expr).show()

#+---+-----+----+-------+------------+
#| id| name|dept|     FK|foreign_keys|
#+---+-----+----+-------+------------+
#|  1|Alpha| ABC|column1|         101|
#|  1|Alpha| ABC|column2|         102|
#|  1|Alpha| ABC|Column3|         103|
#|  2|Bravo| CDE|column1|         104|
#|  2|Bravo| CDE|column2|         105|
#|  2|Bravo| CDE|Column3|         106|
#+---+-----+----+-------+------------+