Как заменить ключи, хранящиеся в строке, значениями, хранящимися в другой таблице в Impala - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть таблица 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 голосов
/ 20 сентября 2018

Вы можете сделать это с помощью функции 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 недоступна)

...