Конвертировать другие типы в массив Impala - PullRequest
0 голосов
/ 22 мая 2018

У меня есть программа, которая вставляет строку, подобную этой ('A','B'), в запрос.Как преобразовать его в вид сбоку массива следующим образом:

col
---
 A
 B

В Impala и Hive нет функции explode(array('A','B')).Я не могу сохранить эти значения в таблице, так как она находится в памяти и динамически внедряется в SQL.

Мне нужна эта причина, потому что у меня есть другая таблица для соединения с элементами в массиве.

Спасибо

1 Ответ

0 голосов
/ 22 мая 2018

Impala позволяет выбирать только примитивные типы как часть оператора select, чтобы взорвать ваш массив (я предполагаю, что в вашей таблице есть только столбец с именем myarray), вам нужно будет сделать что-то подобное.

Демонстрация: In Hive

create table test_array (myarray array<string>) stored as parquet ; 
-- tricky way to insert values for array 

insert into test_array select  array('a','b') from (select '1') t;
insert into test_array select  array('c','d') from (select '1') t;

Импала

select myarray.item from test_array, test_array.myarray ;

Результаты

+------+
| item |
+------+
| a    |
| b    |
| c    |
| d    |
+------+

По умолчанию импала использует имя "item" для доступаваши элементы примитивных массивов.В случае массива структур вам нужно изменить «элемент» для поля, к которому вы хотите получить доступ.

Одна интересная вещь, если мы добавим пустой массив

 insert into test_array select  array() from (select '1') t;

, если мызапустив тот же запрос, вы не увидите пустой массив как часть результата, потому что по сути это похоже на внутреннее соединение между вашими записями и массивом, исключая пустые значения.Если вы хотите включить ваши записи в информацию о пустом массиве, запрос будет выглядеть так:

 select myarray.item from test_array LEFT OUTER JOIN  test_array.myarray ;

+------+
| item |
+------+
| c    |
| d    |
| a    |
| b    |
| NULL |
+------+

(Вы можете найти больше информации о различных объединениях здесь

...