如何用存储在Impala另一个表中的值替换存储在字符串中的键

时间:2018-09-17 11:55:20

标签: sql join impala

我有一个Impala表,将键存储为字符串 该表的模式如下:

CREATE TABLE user_actions_t
 (
    `useractionid` BIGINT,
    `streamid` VARCHAR,
     PRIMARY KEY(useractionid)
 )
 PARTITION BY HASH PARTITIONS 16
 STORED AS KUDU

另外,我有一个字典表:

CREATE TABLE stream_dict_t
     (
        `streamid` BIGINT,
        `stream` varchar,
         PRIMARY KEY(streamid)
     )
     PARTITION BY HASH PARTITIONS 16
     STORED AS KUDU

该表中有简化的数据:

insert into devl_mlc.user_actions_t values (1, '[1,2,3]'), (2, '[2,3]')
insert into devl_mlc.stream_dict_t values (1, 'daily'), (2, 'weekly'), (3, 'monthly')

哪个给:

对于表 stream_dict_t

1   daily  
2   weekly 
3   monthly

以及表 user_actions_t

2   [2,3]
1   [1,2,3]

我想合并两个表,但是由于streamid定义为字符串,所以我不能使用常规连接。

预期结果:

2 [weekly,monthly]
3 [daily,weekly,monthly]

我尝试使用Impala字符串函数,但我不太清楚如何创建一个可以处理数据的查询。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用find_in_set函数执行此操作,您只需要使用键列表从字符串中删除多余的括号并验证索引是否大于0

示例:

select find_in_set("1", replace(replace("[1,2,3]","]",""),"[","") ) > 0;

来自文档。

  

find_in_set(字符串str,字符串strList)用途:返回位置   (从1开始)指定字符串中第一次出现的时间   以逗号分隔的字符串。如果任一参数为NULL,则返回NULL,0   如果找不到搜索字符串,或者为0(如果搜索字符串包含)   逗号。返回类型:int

根据您的Impala版本,您将需要使用regexp_replace而不是replace(如果replace不可用)