代码之家  ›  专栏  ›  技术社区  ›  ConfusedDeveloper

取消查看SPARK SQL中的列组

  •  1
  • ConfusedDeveloper  · 技术社区  · 1 年前

    我有一个这样的表格结构:

    enter image description here

    使用SparkSQL,我想将这些列取消平移为行,以生成如下输出:

    enter image description here

    到目前为止,有两个实现了这一点,我已经写了两个查询,一个针对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
      )))
    

    然后在这两个查询之间执行联接。

    我想知道,有没有更好的选择来实现这一点?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Shubham Sharma mkln    1 年前

    有更好的方法。创建一个(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
    
        2
  •  0
  •   s.polam    1 年前

    请找到以下解决方案。

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