【问题标题】:Join multiple tables in Hive在 Hive 中加入多个表
【发布时间】:2017-08-17 17:58:24
【问题描述】:

下面是数据集

Table1
col1,col2
key1,k1
key2,k2
key3,k3


Table2
col1,col3
key1,k11
key2,k22
key4,k44


Table3
col1,col4
key1,k111
key2,k222
key5,k555

我需要加入基于 col1 的 3 个表。以下是我的查询

从中选择 a.col1,a.col2,b.col3,c.col4 表 1 完全外连接表 2 b 全外连接表3 c;

预期的输出如下所示

预期输出:

col1,col2,col3,col4
key1,k1,k11,k111
key2,k2,k22,k222
key3,k3,   ,
key4,  ,k44,
key5,  ,   ,k555

【问题讨论】:

  • 您希望它成为交叉连接吗?也许你的意思是table1.col1 = table2.col1 and table1.col1 = table3.col1

标签: hadoop hive


【解决方案1】:
  1. 根据您想要的结果,您需要在 col1.
  2. 为确保您始终在 col1 中有一个值,您需要 coalesce他们在一起(coalesce 给你第一个非空 值)。
  3. 要将其他列拼接在一起(并将空值替换为空白,请将 coalesce 与 concat 结合使用:

综合起来:

select
coalesce(t1.col1,t2.col1,t3.col1) as col1,
concat(coalesce(t1.col2,' '),',',coalesce(t2.col2,' '),',',coalesce(t3.col2,' '))
from
table1 t1
full join table2 t2
  on t1.col1 = t2.col1
full join table3 t3
  on t1.col1 = t3.col1

【讨论】:

  • key1 k1,k11,k111 key2 k2,k22,k222 key3 k3, , key4 ,k44, key5 , ,k555 在第一列之后没有得到逗号值
【解决方案2】:

由于您正在执行完全外连接,因此最好为列 col1 执行 COALESCE

类似:

select 
    COALESCE(a.col1, b.col1, c.col1) as col1,
    a.col2,
    b.col3,
    c.col4
from 
    table1 a 
    full outer join table2 b 
      on t1.col1 = t2.col1
    full outer join table3 c
      on t1.col1 = t3.col1;

我们还需要加入条件以避免结果集中出现笛卡尔积。

【讨论】:

  • 以上查询返回 27 行。其中预期的输出为 5 行。
  • 这很好。我该怎么做,当我有 table1.col1 = table2.col1 和 table2.col7=table3.col1
猜你喜欢
  • 2019-02-23
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
相关资源
最近更新 更多