如何根据连接列的条件连接配置单元表

kknvjkwl  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(402)

我们有一个Hive表如下:

num    value 

123     A 
456     B 
789     C 
101     D

联接表是:

num       Symbols

123         ASC
456001      JEN
456002      JEN
456003      JEN
789001      CON
101         URB

我们的预期结果:

num   value   symbols
123    A       ASC
456    B       JEN
789    C       CON
101    D       URB

目前,为了得到结果,我们将两次合并表。就像第一次使用下面的查询插入到某个tmp表中一样:

select
a.num,
a.value,
b.symbols
from mytable a
join mytable b on a.num = b.num;

此查询正在生成的结果 keys 123,101. 接下来,我们将运行另一个查询,如下所示:

select
    a.num,
    a.value,
    b.symbols
    from mytable a
    join mytable b on CONCAT(a.num,'001') = b.num;

此查询正在生成的结果 keys 456, 789 .
这两个查询结果被插入到某个tmp配置单元表中,我们从tmp表中选择最终结果。
总的来说,这个设计看起来很糟糕。但我想知道是否有更好的方法来实现这一点。谢谢。
查询结果
为了

Select 
    a.num
    ,a.value
    ,b.symbols 
    from 
    (select substr(num,3) as num, value from table)a
    join 
    (select substr(num,3) as num, symbols from table) b
    on a.num = b.num

a.num   a.value b.symbols
3        A      ASC
1        D      URB
mklgxw1f

mklgxw1f1#

您可以尝试使用左半连接和上面的查询,如下所示。
从mytable1 a left semi join mytable2 b on substr(cast(b.num as string),0,3)=cast(a.num as string)中选择a.num、a.value、b.symbols

sxissh06

sxissh062#

如果num的数据类型是string,那么可以尝试使用substr

Select 
a.num
,a.value
,b.symbols 
from a join b on 
substr(a.num,3) = substr(b.num,3)
disho6za

disho6za3#

你能试试这个吗

Select 
    a.num
    ,a.value
    ,b.symbols 
    from 
    (select substr(num,3) as num, value from table)a
    join 
    (select substr(num,3) as num, symbols from table) b
    on a.num = b.num
fae0ux8s

fae0ux8s4#

好的,只要一个sql就可以实现您的需求。请看下面,表a是带有value列的表,表b是带有symbols列的表,sql:

select
    distinct a.num,
    a.value,
    b.symbols
from
    mytable1 a
join
    mytable2 b on substr(cast(b.num as string),0,3) = cast(a.num as string)

相关问题