Вид сбоку куста на примере примера с таблицей улья, имеющей 2 столбца в виде массива - PullRequest
0 голосов
/ 01 мая 2018

У меня есть строка с данными в формате:

Col1    col2     col3
1       (1,2,3)  (A,B,C)

Я хочу вывод в формате:

col1  col2  col3
==== ====== =====
1      1    A
1      2    B
1      3    C

Я не могу использовать Explode для получения данных в этом формате

1 Ответ

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

Вы можете попробовать этот подход:

Зарегистрировать улей 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...