Вы можете попробовать этот подход:
Зарегистрировать улей UDF
Найдите hive-contrib-<version>.jar
для своего дистрибутива и добавьте его в Hive, чтобы он был доступен для всех узлов. Ниже приведен путь из дистрибутива Hortonworks HDP.
hive (default)> add jar /usr/hdp/current/hive-client/lib/hive-contrib-1.2.1000.2.5.3.0-37.jar;
Зарегистрируйте row_sequence()
UDF.
hive (default)> create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';
Выполнить запрос
SELECT e.col1 col1, f.col2 col2, f.col3 col3
FROM
hive_tbl e,
(
SELECT c.col2, d.col3
FROM
(
SELECT row_sequence() entryseq, a.col2
FROM
(
SELECT EXPLODE(col2) col2
FROM hive_tbl
) a
) c
JOIN
(
SELECT row_sequence() entryseq, b.col3
FROM
(
SELECT EXPLODE(col3) col3
FROM hive_tbl
) b
) d
ON
c.entryseq = d.entryseq
) f;
Иллюстрация:
Файл данных
-- testarray.txt
1|1,2,3|A,B,C
Загрузить файл в HDFS
hadoop fs -mkdir /hive-data/array
hadoop fs -put testarray.txt /hive-data/array
Создание и проверка таблицы кустов
CREATE EXTERNAL TABLE `default.hive_tbl`(
col1 string,
col2 array<string>,
col3 array<string>
)
row format delimited
fields terminated by '|'
collection items terminated by ','
lines terminated by '\n'
LOCATION 'hdfs:////hive-data/array';
select * from hive_tbl;
hive_tbl.col1 hive_tbl.col2 hive_tbl.col3
1 ["1","2","3"] ["A","B","C"]
Выполнить запрос
-- query output
col1 col2 col3
1 1 A
1 2 B
1 3 C