Улей: Как взорвать таблицу с колонкой карты - PullRequest
0 голосов
/ 02 марта 2019

У меня есть такая таблица

+-----+------------------------------+
| id    | mapCol                     |
+-----+------------------------------+
| id1   |     {key1:val1, key2:val2} |
| id2   |     {key1:val3, key2:val4} |
+-----+------------------------------+

, поэтому я могу легко выполнить запрос вроде

select explode(mapCol) as (key, val) from myTab where id='id1'

, и я получу

+--------+-----+
| key    | val |
+--------+-----+
| key1   | val1|
| key2   | val2|
+--------+-----+

Я хочу создать таблицу, подобную этой

+-----+------+-----+
|id   | key  | val |
+-----+------+-----+
| id1 | key1 | val1|
| id1 | key2 | val2|
| id2 | key1 | val3|
| id2 | key2 | val4|
+-----+------------+

, отметьте, что я хочу отобразить id вместе с разнесенными строками.Кроме того, для нескольких идентификаторов key может повторяться, поэтому я хочу, чтобы строки отражали это.По сути, id + key должен быть уникальным.

Как мне написать запрос для этого?Я пытался

select explode(mapCol) as (key, val), id from myTab

, но я получил

FAILED: SemanticException 1:66 Only a single expression in the SELECT clause is supported with UDTF's

1 Ответ

0 голосов
/ 02 марта 2019

Использование вид сбоку :

with MyTable as -------use your table instead of this subquery
(select id, str_to_map(mapStr) mapCol
from
(
select stack(2,
'id1','key1:val1,key2:val2',
'id2','key1:val3,key2:val4'
) as (id, mapStr))s
) -------use your table instead of this subquery

select t.id, s.key, s.val
  from MyTable t
       lateral view outer explode(mapCol) s  as key, val;

Результат:

OK
id1     key1    val1
id1     key2    val2
id2     key1    val3
id2     key2    val4
Time taken: 0.072 seconds, Fetched: 4 row(s)

Использовать таблицу вместо MyTable подзапроса.

Прочитайте также этот ответ о боковой проекции: https://stackoverflow.com/a/51846380/2700344.

...