在SPARK SQL中取消透视列组

ig9co6j1  于 7个月前  发布在  Apache
关注(0)|答案(2)|浏览(61)

我有一个这样的表结构:

使用SparkSQL,我想将这些列反透视为行,以产生如下输出:

到目前为止,有两个实现了这一点,我已经编写了两个查询,一个用于A,一个用于B,如下所示:

select ID, Rank, Criteria  from (
SELECT *
    FROM Temp_Test_Hardik
  UNPIVOT( Rank for Criteria IN (
    A1,
    A2,
    A3
  )))

select ID, Rank, Criteria  from (
SELECT *
    FROM Temp_Test_Hardik
  UNPIVOT( Rank for Criteria IN (
    B1,
    B2,
    B3
  )))

然后在这两个查询之间执行连接。
我想知道是否有更好的选择来实现这一目标?

jexiocij

jexiocij1#

有一个更好的方法,创建一个由(A,B)对组成的结构体数组,然后使用inline将数组分解为行和列

SELECT 
    PK, 
    inline(array(
        struct(A1 AS A, B1 AS B), 
        struct(A2 AS A, B2 AS B), 
        struct(A3 AS A, B3 AS B)
    ))
FROM Temp_Test_Hardik
sbtkgmzw

sbtkgmzw2#

请找到下面的解决方案。

SELECT
  PK,
  inline(
    array(
      named_struct(
        'Rank', 1, 
        'A', A1, 
        'B', B1
      ), 
      named_struct(
        'Rank', 2, 
        'A', A2, 
        'B', B2
      ), 
      named_struct(
        'Rank', 3, 
        'A', A3, 
        'B', B3
      )
    )
  )
FROM source
+---+----+----+----+
|PK |Rank|A   |B   |
+---+----+----+----+
|1  |1   |A1-1|B1-1|
|1  |2   |A2-1|B2-1|
|1  |3   |A3-1|B3-1|
|2  |1   |A1-2|B1-2|
|2  |2   |A2-2|B2-2|
|2  |3   |A3-2|B3-2|
+---+----+----+----+

相关问题