Hive - Разбить столбец массива и использовать левое соединение или подзапрос с оператором выбора. Ошибка

Даны две таблицы:

filtered_locations содержащий небольшой набор данных (всего несколько строк)

|-------------|
| loc<String> | 
|-------------|
|     ...     |
|-------------|   

table_clients очень большая таблица (миллионы строк)

 |--------------------------------------------|
 | id  | name|  age |locations <array<String> | 
 |-----|--------------------------------------|
 |     |     |      | [a,b,c..]               |
 |--------------------------------------------|

Я хочу запросить таблицу table_clients для значения на filtered_locations, главная проблема заключается в том, что поле для запроса на table_clients является array тип.

Итак, я взорвал столбец, а затем попытался встроить подзапрос, чтобы включить только местоположения, перечисленные в filtered_locations,

Первая проблема, с которой я столкнулся, заключается в том, что Hive (по крайней мере, версия, на которой я работаю), кажется, не принимает подзапрос внутри in или же exists Постулаты.

Вот ошибка, которую я получаю:

Ошибка при компиляции оператора: СБОЙ: SemanticException Недопустимая ссылка на столбец 'location' в определении SubQuery sq_1 [ tc.location in (выберите fl.loc из Filter_locations fl) ], используемый в качестве sq_1

В качестве альтернативы я попытался использовать LEFT JOIN но также не работает из-за explode Вторая ошибка вызова

Ошибка при компиляции оператора: СБОЙ: SemanticException [Ошибка 10085]: СОЕДИНЕНИЕ с ПОРОГОВЫМ ВИДОМ не поддерживается 'location'

with filtered_locations as (
  SELECT
    'loc1' as loc
    union all
    'loc2' as loc
)

select 
  id, name, location
  max(age) as max_age 
from
  table_clients tc
  LATERAL VIEW EXPLODE(locations) l as location
-- Ideally this should work!
-- where
--  tc.location in (
--     select fl.loc from filtered_locations fl
--  )
left join filtered_locations fl
on fl.loc = tc.location

group by id, name, location

Каково тогда лучшее решение для моей проблемы? Обратите внимание, что table_clients имеет миллионы записей!

Спасибо

1 ответ

Теоретически это должно было сработать

select  *

from    table_clients c
        lateral view explode(location) e as loc

where   e.loc in (select l.loc from filtered_locations l)
;

СБОЙ: SemanticException [Ошибка 10009]: Строка 6:8 Недопустимый псевдоним таблицы 'e'

... но так как это не так, нужно немного обойти

select  *

from   (select  *

        from    table_clients c
                lateral view explode(location) e as loc
        ) c        

where   c.loc in (select l.loc from filtered_locations l)
;
Другие вопросы по тегам