Hive: Разделяйте одну запись на несколько записей, когда значения столбцов разделяются разделителем (~) - PullRequest
1 голос
/ 07 ноября 2019

У меня есть следующая информация

id     user                 date                          test

102   123~456~897   01JAN2019~6JUL2018~21DEC2017        abc~qwer~~wer~
103  13~45~88~34   01JAN2020~6JUN2019~21JAN2018~12MAR2017 pqr~~qw~wer*123~qwerty

Нужный мне результат, записи должны быть расширены на основе возрастающей даты.

id      user     date            test 

102     897      21DEC2017        wer
102     456      06JUL2018        qwer
102     123      01JAN2019        abc
103     34       12MAR2017        qwerty
103     88       21JAN2018        wer*123
103     45       06JUN2019        qw
103     13       01JAN2020        pqr

Я пробовал с боковым представлением posexplode, но этоне работает должным образом, пожалуйста, помогите.

a.id, 
    from demo a
    lateral view posexplode(a.test,'\\~')) t1 as exploded_test,test
    lateral view posexplode(a.user,'\\~')) t2 as exploded_user, user
    lateral view posexplode(a.date,'\\~')) t3 as exploded_date, date
    where exploded_test == exploded_user and exploded_user == exploded_date
    order by 1,3

1 Ответ

1 голос
/ 07 ноября 2019

Тильда (~) не является метасимволом в регулярном выражении Java (Hive использует регулярное выражение Java) и не нуждается в экранировании. Также к массиву можно применить posexplode или explode, вам нужно разбить строку, чтобы получить массив перед взрывом. Используйте posexplode(split(a.user,'~+')) t1 as (pos,user)

Также (это просто мнение): я бы не назвал позицию массива "exploded_test". pos или position или просто p будет выглядеть менее запутанным

...