Привет всем, сегодня я познакомлю вас с двумя часто используемыми и мощными функциями Hive: взрыв и поза, которые играют незаменимую роль при обработке сложных типов данных. Давайте посмотрим на их использование и примеры ниже.
Функция Explode — это волшебная функция в Hive, которая может расширять столбцы типа массива или карты. На самом деле, Латерал, упомянутый в нашей предыдущей статье viewПросто иexplodeфункцияиспользуется совместно с。(Углубленное понимание Lateral в Hive Вид и боковой вид View Использование внешнего)
Предположим, у нас есть таблица с типом массива:
create table array_table(id int, items array<string>);
insert into array_table(id,items)
values
(1, array('apple', 'banana', 'pear')),
(2, array('watermelon', 'orange')),
(3, array(null));
Набор данных следующий
+-----+----------------------------+
| id | items |
+-----+----------------------------+
| 1 | ["apple","banana","pear"] |
| 2 | ["watermelon","orange"] |
| 3 | NULL |
+-----+----------------------------+
Затем мы используем функцию разнесения, чтобы развернуть столбец элементов:
select explode(items) as item from array_table;
Результатом будет:
+-------------+
| item |
+-------------+
| apple |
| banana |
| pear |
| watermelon |
| orange |
+-------------+
Здесь следует отметить, что функцию разнесения можно запросить только напрямую, и она не может добавлять другие столбцы. Если вы хотите добавить другое содержимое столбца, вам нужно использовать ее с боковым видом [внешний].
Если вы добавите столбец напрямую, будет сообщено о следующей ошибке:
select id,explode(items) as item from array_table;
Error: Error while compiling statement: FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions (state=42000,code=10081)
Помимо возможности расширять столбцы типа массива или карты, такие как функция разнесения, функция Posexplode также может одновременно возвращать позицию (т. е. индекс) развернутого элемента.
Давайте снова воспользуемся таблицей array_table в качестве примера, на этот раз используяposeexplode:
select posexplode(items) as (itemIndex, item) from array_table;
оказаться:
+------------+-------------+
| itemindex | item |
+------------+-------------+
| 0 | apple |
| 1 | banana |
| 2 | pear |
| 0 | watermelon |
| 1 | orange |
+------------+-------------+
Вы обнаружите, что функцияposeexplode возвращает индекс и значение массива вместе, что очень полезно в сценариях, где вам нужно заботиться как о значении элемента, так и о его положении в массиве.
Я полагаю, что благодаря приведенным выше примерам вы уже имеете определенное представление о взрывах и позах взрывах. В реальной обработке данных важность этих двух функций очевидна. Надеемся, это руководство поможет вам более комфортно работать со сложными типами данных.