在 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|
#+---+-----+----+-------+------------+
我正在尝试将带有外键的列的 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|
#+---+-----+----+-------+------------+