执行concat_ws和collect_list后,Hive Coalesce函数未返回预期结果

时间:2017-10-27 20:05:18

标签: mysql hadoop hive coalesce

我需要在表服务中转动列servicename,然后合并值。

services:
userid servicename
1      A
2      B
2      C
3      B
1      C
4
5      C

我正在尝试的查询是

SELECT userid,
       COALESCE(a,b,c) AS servicename
FROM (SELECT userid,
             concat_ws('',a) AS a,
             concat_ws('',b) AS b,
             concat_ws('',c) AS c
      FROM (SELECT userid,
                   collect_list(a.group_map['A']) AS a,
                   collect_list(a.group_map['B']) AS b,
                   collect_list(a.group_map['C']) AS c
            FROM (SELECT userid,
                         MAP(servicename,servicename) AS group_map
                  FROM (SELECT userid, servicename, servicename FROM services) AS table1) AS table2) AS table3) AS table4

以下是每个SELECT查询的细分结果:

查询1:

SELECT userid,
       servicename,
       servicename
FROM services

结果1:

userid servicename servicename
   1      A           A
   2      B           B
   2      C           C
   3      B           B
   1      C           C
   4 
   5      C           C 

查询2:

SELECT userid,
       MAP(servicename,servicename) AS group_map
FROM table1

结果2:

userid    group_map
    1      {"A":"A"}
    2      {"B":"B"}
    2      {"C":"C"}
    3      {"B":"B"}
    1      {"C":"C"}
    4      {"null":"null"}
    5      {"C":"C"}

查询3:

SELECT userid,
       collect_list(a.group_map['A']) AS a,
       collect_list(a.group_map['B']) AS b,
       collect_list(a.group_map['C']) AS c
FROM table2

结果3:

userid    a      b      c
1       ["A"]         ["C"]
2              ["B"]  ["C"]
3              ["B"]
4           
5                     ["C"]

以下concat_ws函数是将数组转换为String

查询4:

SELECT userid,
       concat_ws('',a) AS a,
       concat_ws('',b) AS b,
       concat_ws('',c) AS c
FROM table3

结果4:

userid    a    b   c
1         A        C
2              B   C
3              B
4           
5                  C

最后在查询中使用COALESCE函数得到如下结果:

查询5

SELECT userid,
       COALESCE(a,b,c) AS servicename
FROM table4

以下是我希望看到的结果

结果5:

userid  servicename
1       A
2       B
3       B
4
5       C

但是,我只获得Service A或null,如下所示:

userid  servicename
    1       A
    2       
    3       
    4
    5       

有人怀疑有任何问题吗?需要铸造吗?

我一直在尝试不同的东西,并尝试在网上搜索,但还没有运气。

提前致谢!

1 个答案:

答案 0 :(得分:1)

看起来你只想要每个id的1个服务名称

select * from 
(
     select userid,servicename,row_number() over (partition by userid order by servicename) as row_no 
) res
where res.row_no = 1

这应该可以帮到你

userid  servicename
1       A
2       B
3       B
4
5       C

如果您尝试为每个用户标识转移服务名称

select userid, collect_set(servicename)
from table
group by userid;

这应该可以帮到你

userid  servicename
1       A,C
2       B,C
3       B
4
5       C