Можем ли мы создать несколько записей из одной строки? - PullRequest
1 голос
/ 09 мая 2019

Мои журналы выглядят так: client_id;event_1;event_2;event3

И я хотел бы получить таблицу SQL, например:

 client_id |   event
 ---------------------
    ...    |  event_1
    ...    |  event_2
    ...    |  event_3

Я новичок в Hive, мне кажется, чтоодна строка журнала всегда обеспечивает одну запись в результирующей таблице SQL.Я попробовал следующее (безуспешно):

CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
         client_id String,
         `event` String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
         "input.regex" = "^([^\;]+);.*([^\;]+).*$" )
LOCATION 's3://myBucket/prefix/';

Он принимает только первое событие и игнорирует остальные ...

1 Ответ

3 голосов
/ 09 мая 2019

К сожалению, невозможно создать строки с использованием SerDe в таблице DDL.В Hive можно сделать то же самое.

(1) Считать все пользовательские события в виде одного столбца:

CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
         client_id String,
         events    String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
 "input.regex" = "^([^\\;]+)\\;(.*)$" )
LOCATION 's3://myBucket/prefix/';

Проверьте, должны ли считываться два столбца: user_id и все события объединяются:

'client_id' и 'event_1;event_2;event3'

(2) Разделить события и разбить их для генерации строк:

 select t.user_id, e.event
   from tablename t
        lateral view outer explode(split(t.events,'\\;')) e as event;

Подробнее о Боковое представление .

В Афине используйте UNNEST с CROSS JOIN :

select t.user_id, e.event
       from tablename t
       CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)
...