【问题标题】:Hive table join with update带更新的 Hive 表连接
【发布时间】:2016-01-29 23:48:34
【问题描述】:

我有点卡住了,任何人都可以在这里帮助我。我有两个具有以下结构的表。

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 匹配,则再次为同一记录用通用代码替换它。如果没有匹配,则保留 code1 和 code2 的值。我需要获取表 1 中的所有记录。表 1 和表 2 通过 Id 连接。

我为一列尝试了以下内容,但在添加 code2 时遇到了问题

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

【问题讨论】:

  • 使用= 而不是==
  • @vkp :好的,但是我如何为第二列添加逻辑。我当时就卡住了。
  • 是的..您必须重复多次,以更改要更改的列数
  • @vkp:如果您查看连接条件,我在其中使用了 Id 和 Code1。我也可以将 Code2 添加到 On 条件中,但这会导致正确答案
  • 我认为a.id=b.idjoin 子句中就足够了。

标签: sql hadoop hive hql jointable


【解决方案1】:

我们可以试试下面的查询:-

 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 ;

【讨论】:

  • 我会试试的。我终于用多个左外连接做到了。谢谢你的提示。非常感谢。
【解决方案2】:

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

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;

【讨论】:

  • 是的,我尝试了上述方法。问题在于表 1(a) 中的每个条目在表 2(b) 中有三个条目。我相信这会导致错误答案的记录多于预期。我添加了一个测试数据以防万一您感到困惑。
  • 你能在这里写下预期输出的例子吗?使用您的测试数据
  • 表 1 中的 1,123,ABCD ,(First Row) 与表 2 中的 3 行 , , 匹配。 (匹配键为(Id)。代码 1(123)与第二个表中的 UserCode(123)匹配。因此将代码 1 替换为 XXX(UniversalCode)。现在代码 2(ABCD)没有匹配项,因此保留了值 ABCD。 then 的输出是 1,XXX,ABCD 。类似的逻辑必须适用于所有记录。如果代码 1 匹配替换或保留。如果代码 2 匹配替换或保留。
  • 我没有看到问题哥们,我上面写的代码会给你那个输出,因为你匹配的是CASE语句中的UserCode。
  • 那我再试一次。谢谢:)
猜你喜欢
  • 2013-07-27
  • 2011-09-22
  • 1970-01-01
  • 2017-02-04
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多