Разнесите таблицу улья с несколькими столбцами массива, включая нулевые значения - PullRequest
0 голосов
/ 03 августа 2020

У меня есть таблица ульев, как показано ниже. Количество элементов в каждом столбце непредсказуемо. Может ли кто-нибудь сказать мне, как правильно взорвать все столбцы этой таблицы, не теряя нулевые значения.

+-------------------------------+-------------------+----------------------------+--+
| l1.skillcode                  | l1.duration       |     l1.numberofpeople      |
+-------------------------------+-------------------+----------------------------+--+
| ["ACFC"]                      | ["00020"]         | ["1"]                      |
| ["ACFC"]                      | ["00233"]         | ["1"]                      |
| ["AJBS"]                      | ["00605"]         | ["1"]                      |
| ["ACFC"]                      | ["00020"]         | ["1"]                      |
| ["TESTING"]                   | ["123456"]        | ["09876"]                  |
| ["ACFC"]                      | ["00233","846"]   | ["1"]                      |
| ["AJBS"]                      | ["00605"]         | ["1"]                      |
| ["ACFC"]                      | ["00020"]         | ["1"]                      |
| ["TESTING"]                   | NULL              | ["09876"]                  |
| ["ACFC"]                      | ["00233"]         | NULL                       |
| ["AJBS"]                      | ["00605"]         | ["1"]                      |
| ["ACFC"]                      | ["00020"]         | ["1"]                      |
| ["TESTING"]                   | NULL              | ["09876","09877","09878"]  |
| NULL                          | ["56743"]         | ["45678","345"]            |
| ["ACFC","BES","SAL","EPD"]    | ["00233"]         | ["1"]                      |
| ["AJBS"]                      | ["00605"]         | ["1"]                      |
| NULL                          | ["00020"]         | ["1"]                      |
| ["TESTING"]                   | NULL              | ["09876","09877","09878"]  |
| NULL                          | ["56743"]         | ["45678","345"]            |
| ["ACFC"]                      | ["00020"]         | ["1"]                      |
| ["TESTING"]                   | NULL              | ["09876","09877","09878"]  |
| ["ACFC"]                      | ["00233"]         | ["1"]                      |
| ["AJBS"]                      | ["00605"]         | ["1"]                      |
+-------------------------------+-------------------+----------------------------+--+

Когда я пытаюсь сделать это ниже, я получаю нулевые значения столбца, который я пытаюсь взорвать, и связанные с ним ненулевые значения этой строки удалены.

select L2.*,t1.duration,t1.numberofpeople from t1 
lateral view explode(t1.skillcode) L2;

Как расчленить все столбцы таблицы без потери каких-либо значений NULL, а также сохранить связь между значениями всех 3 столбцов.

1 Ответ

1 голос
/ 03 августа 2020

используйте lateral view outer вместо lateral view

hive> select * from L2;
OK
["BES","SAL"]   ["00020","846"] ["1","09876"]
["SEAL"]    []  []
[]  ["0020","0021"] []
Time taken: 0.088 seconds, Fetched: 3 row(s)
hive> select L3.*,L4.*,L5.* from L2  lateral view outer explode(L2.skillcode) L3 lateral view outer explode(L2.duration) L4 lateral view outer explode(L2.numberofpeople) L5;
OK
BES 00020   1
BES 00020   09876
BES 846 1
BES 846 09876
SAL 00020   1
SAL 00020   09876
SAL 846 1
SAL 846 09876
SEAL    NULL    NULL
NULL    0020    NULL
NULL    0021    NULL
Time taken: 0.119 seconds, Fetched: 11 row(s)

Примечание: вручную создайте и вставьте данные в тип столбца массива в кусте.

CREATE TABLE `L2`(
  `skillcode` array<string>, 
  `duration` array<string>, 
  `numberofpeople` array<string>)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://localhost:9000/stackoverflow/data/hive/dwh/l2';
-- to insert the data
INSERT INTO L2  select array() as skillcode,array('0020','0021') as duration,array() as numberofpeople FROM (select '1' ) t;

...