Сводные строки по-другому, используя MySQL или SparkDataframe - PullRequest
2 голосов
/ 03 августа 2020

У меня есть такая таблица, я делаю обычное вращение, что не дает желаемого результата.

+-----------------------------------------------------------+-----------------------------------------------------------------------------
|type                                                       |column_ref                                            |table_object         |
+-----------------------------------------------------------+-----------------------------------------------------------------------------
foreignKeyColumn                                             FRED.FRED.BACHELOR_DEGREE_OR_HIGHER.REGION_CODE       FRED.FRED.US_REGIONS  |
primaryKeyColumn                                             FRED.FRED.US_REGIONS.REGION_CODE                      FRED.FRED.US_REGIONS  |

foreignKeyColumn                                             FRED.FRED.MEAN_REAL_WAGES_COLA.REGION_CODE            FRED.FRED.US_REGIONS  |
primaryKeyColumn                                             FRED.FRED.US_REGIONS.REGION_CODE                      FRED.FRED.US_REGIONS  |

foreignKeyColumn                                             FRED.FRED.PER_CAPITA_PERSONAL_INCOME.REGION_CODE      FRED.FRED.US_REGIONS  |
primaryKeyColumn                                             FRED.FRED.US_REGIONS.REGION_CODE                      FRED.FRED.US_REGIONS  |

foreignKeyColumn                                             FRED.FRED.HOMEOWNERSHIP_RATE.REGION_CODE              FRED.FRED.US_REGIONS  |
primaryKeyColumn                                             FRED.FRED.US_REGIONS.REGION_CODE                      FRED.FRED.US_REGIONS  |
+-----------------------------------------------------------+-----------------------------------------------------------------------------

Я хочу получить это таким образом:

+-----------------------------------------------------------+-----------------------------------------------------------------------------
|foreignKeyColumn                                           |primaryKeyColumn                                            |table_object   |
+-----------------------------------------------------------+-----------------------------------------------------------------------------
FRED.FRED.BACHELOR_DEGREE_OR_HIGHER.REGION_CODE             FRED.FRED.US_REGIONS.REGION_CODE                              FRED.FRED.US_REGIONS
FRED.FRED.MEAN_REAL_WAGES_COLA.REGION_CODE                  FRED.FRED.US_REGIONS.REGION_CODE                              FRED.FRED.US_REGIONS
FRED.FRED.PER_CAPITA_PERSONAL_INCOME.REGION_CODE            FRED.FRED.US_REGIONS.REGION_CODE                              FRED.FRED.US_REGIONS
FRED.FRED.HOMEOWNERSHIP_RATE.REGION_CODE                    FRED.FRED.US_REGIONS.REGION_CODE                              FRED.FRED.US_REGIONS

Я пробовал сделать это вот так:

  val grouped = df.groupBy("table_object").pivot("type").agg(first("column_ref"))

Но это не дает ожидаемых результатов. Может ли кто-нибудь предложить, что можно сделать для желаемого результата?

Нормальное SQL / DF решение, оба будут полезны.

1 Ответ

2 голосов
/ 03 августа 2020

Возможно, это полезно -

pivot + arrays_zip

df2.show(false)
    df2.printSchema()
    /**
      * +----------------+------------------------------------------------+--------------------+
      * |type            |column_ref                                      |table_object        |
      * +----------------+------------------------------------------------+--------------------+
      * |foreignKeyColumn|FRED.FRED.BACHELOR_DEGREE_OR_HIGHER.REGION_CODE |FRED.FRED.US_REGIONS|
      * |primaryKeyColumn|FRED.FRED.US_REGIONS.REGION_CODE                |FRED.FRED.US_REGIONS|
      * |foreignKeyColumn|FRED.FRED.MEAN_REAL_WAGES_COLA.REGION_CODE      |FRED.FRED.US_REGIONS|
      * |primaryKeyColumn|FRED.FRED.US_REGIONS.REGION_CODE                |FRED.FRED.US_REGIONS|
      * |foreignKeyColumn|FRED.FRED.PER_CAPITA_PERSONAL_INCOME.REGION_CODE|FRED.FRED.US_REGIONS|
      * |primaryKeyColumn|FRED.FRED.US_REGIONS.REGION_CODE                |FRED.FRED.US_REGIONS|
      * |foreignKeyColumn|FRED.FRED.HOMEOWNERSHIP_RATE.REGION_CODE        |FRED.FRED.US_REGIONS|
      * |primaryKeyColumn|FRED.FRED.US_REGIONS.REGION_CODE                |FRED.FRED.US_REGIONS|
      * +----------------+------------------------------------------------+--------------------+
      *
      * root
      * |-- type: string (nullable = true)
      * |-- column_ref: string (nullable = true)
      * |-- table_object: string (nullable = true)
      */
    val p = df2
      .groupBy("table_object")
      .pivot("type")
      .agg(collect_list("column_ref"))
    
    p
      .withColumn("x", arrays_zip($"foreignKeyColumn", $"primaryKeyColumn"))
      .selectExpr("table_object", "inline_outer(x)" )
      .show(false)

    /**
      * +--------------------+------------------------------------------------+--------------------------------+
      * |table_object        |foreignKeyColumn                                |primaryKeyColumn                |
      * +--------------------+------------------------------------------------+--------------------------------+
      * |FRED.FRED.US_REGIONS|FRED.FRED.BACHELOR_DEGREE_OR_HIGHER.REGION_CODE |FRED.FRED.US_REGIONS.REGION_CODE|
      * |FRED.FRED.US_REGIONS|FRED.FRED.MEAN_REAL_WAGES_COLA.REGION_CODE      |FRED.FRED.US_REGIONS.REGION_CODE|
      * |FRED.FRED.US_REGIONS|FRED.FRED.PER_CAPITA_PERSONAL_INCOME.REGION_CODE|FRED.FRED.US_REGIONS.REGION_CODE|
      * |FRED.FRED.US_REGIONS|FRED.FRED.HOMEOWNERSHIP_RATE.REGION_CODE        |FRED.FRED.US_REGIONS.REGION_CODE|
      * +--------------------+------------------------------------------------+--------------------------------+
      */
...