hive表连接与更新

yhived7q  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(393)

我有点困了,有人能帮我吗。我有两张结构如下的table。

Table 1
Id String
Code1 String
Code2 String

Table 2
Id String
UserCode String
UniversalCode String

我需要做的是用表2中的universalcode替换code1和code2中的所有值。更清楚的是,如果code1与usercode匹配,则用universalcode重新计算code1;如果code2与usercode匹配,则用universalcode替换同一记录。如果不匹配,则保留code1和code2的值。我需要表1的所有记录。表1和表2通过id连接。
我尝试了下面的一个专栏,但被困在添加代码2

SELECT 
Id,
CASE WHEN a.Code1 = b.UserCode then b.UniversalCode else a.Code1 end
from table1 a
LEFT OUTER JOIN table2 b ON (a.Id = b.Id and a.code1 = b.UserCode);

有什么建议吗,实际场景有5-6列,我需要在其中应用相同的逻辑。

Test Data 

Table 1
1,123,ABCD
1,ABCD,123
1,456,BCD
1,BCD,789
1,789,100

Table 2 
1,123,XXX
1,456,YYY
1,789,ZZZ
2,123,XXX
2,456,YYY
2,789,ZZZ

Output 
1,XXX,ABCD
1,ABCD,XXX
1,YYY,BCD
1,BCD,ZZZ
1,ZZZ,100

output with a.id=b.id in Join(Please refer below comments for this output)
1       123     XXX     100     100
1       123     123     100     100
1       123     123     100     100
1       ABCD    ABCD    101     101
1       ABCD    ABCD    101     101
1       ABCD    ABCD    101     101
1       456     456     DEF     DEF
1       456     YYY     DEF     DEF
1       456     456     DEF     DEF
1       BCD     BCD     789     789
1       BCD     BCD     789     789
1       BCD     BCD     789     ZZZ
1       789     789     CDE     CDE
1       789     789     CDE     CDE
1       789     ZZZ     CDE     CDE
1       100     100     HBT     HBT
1       100     100     HBT     HBT
1       100     100     HBT     HBT
1       100     100     123     XXX
1       100     100     123     123
1       100     100     123     123
ocebsuys

ocebsuys1#

我不确定我是否理解你,但这样的事情应该能帮助你。

SELECT 
     a.Id
   , CASE WHEN a.Code1 = b.UserCode THEN b.UniversalCode ELSE a.Code1 END AS Code1
   , CASE WHEN a.Code2 = b.UserCode THEN b.UniversalCode ELSE a.Code2 END AS Code2
FROM    table1 a
    LEFT OUTER JOIN 
        table2 b 
        ON a.Id = b.Id;
inn6fuwd

inn6fuwd2#

我们可以试试下面的query:-

SELECT 
    Id,
    CASE WHEN Code1 = UserCode then UniversalCode else Code1 end,
    CASE WHEN Code2= UserCode then UniversalCode else Code2 end
    from
    (select a.id,a.Code1,a.Code2,b.UserCode,b.UniversalCode
    from table1 a
    LEFT OUTER JOIN table2 b ON (a.Id = b.Id and a.code1 = b.UserCode) union 
    select a.id,a.Code1,a.Code2,b.UserCode,b.UniversalCode
    from table1 a
    LEFT OUTER JOIN table2 b ON (a.Id = b.Id and a.code1 = b.UniversalCode)) dat ;

相关问题