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

HiveQL:构建成对比较表

  •  0
  • user2205916  · 技术社区  · 6 年前

    我正在尝试构建一个蜂巢表,其中包含 ids 。例如,我们从table开始 A :

    id  val
    a   10
    b   11
    c   12
    

    我想创建一个表 B :

    id_A  id_B  val_A  val_B  val_diff
    a     b     10     11     -1
    a     c     10     12     -2
    b     c     11     12     -1
    

    我相信这需要一个自我加入,但我不知道如何做。欢迎您提出任何建议或线索。

    我试过:

    CREATE TABLE C STORED AS ORC AS
    SELECT a.id         AS id_A, 
           b.id         AS id_B,
           a.val         AS val_A,
           b.val         AS val_B,
           a.val - b.val AS val_diff
    FROM A AS a
    INNER JOIN B as b
    ON a.id != b.id;
    

    但它不起作用:

    FAILED: SemanticException [Error 10017]: Line 4:3 Both left and right aliases encountered in JOIN 'id'
    

    更新时间: 问题扩展。

    假设我有桌子 A' :

    id  val  category
    a   10   X
    b   11   X
    c   12   X
    d   13   Y
    e   14   Y
    f   15   Y
    

    如何仅在每个元素之间进行成对比较 category ?

    一、 e.一张桌子 B' :

    id_A  id_B  val_A  val_B  val_diff cat
    a     b     10     11     -1       X
    a     c     10     12     -2       X
    b     c     11     12     -1       X
    d     e     . . .                  Y
    d     f     . . .                  Y
    e     f     . . .                  Y
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    使用自联接:

    select a.id as id_a, b.id as id_b, a.val as val_a, b.val as val_b,
           (a.val - b.val) as val_diff
    from t a join
         t b
         on a.id < b.id;
    

    在Hive中,您可能需要执行以下操作:

    select a.id as id_a, b.id as id_b, a.val as val_a, b.val as val_b,
           (a.val - b.val) as val_diff
    from t a cross join
         t b
    where a.id < b.id;