【问题标题】:Pivot Spark Dataframe Columns to Rows with Wildcard column Names in PySpark在 PySpark 中将 Spark 数据框列旋转到具有通配符列名称的行
【发布时间】:2023-04-02 16:04:01
【问题描述】:

我正在尝试使用具有另一个表的外键的列来旋转 spark Dataframe。所有此类列名称都以FK_<column_name> 开头。此类列的数量可以是 1 或更多。

我希望能够将列名以FK_ 开头的所有列转换为一列中的行,以便我可以与另一个表连接。我不需要另一列中的列名称,但如果枢轴操作也可以。

我的示例表

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

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以获取名称以FK_ 开头的列的列表,并将stack 表达式构建到unpivot 数据框:

    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|
    #+---+-----+----+-------+------------+
    

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多