1???Example of vertical table (vtable)
uid | key | value |
101 | c1 | 11 |
101 | c2 | 12 |
101 | c3 | 13 |
102 | c1 | 21 |
102 | c2 | 22 |
102 | c3 | 23 |
2???Example of horizontal table (htable)
uid | c1 | c2 | c3 |
101 | 11 | 12 | 13 |
102 | 21 | 22 | 23 |
htable → vtable :列?转行?常用?函数?
1.LATERAL VIEW explode函数(HIVE)
代码如下:
SELECT t1.uid, t2.key, t2.value
FROM htable t1
LATERAL VIEW explode (map(
'c1', c1,
'c2', c2,
'c3', c3
)) t2 as key, value
2.CROSS JOIN unnest函数?(Presto)
代码如下:
SELECT t1.uid, t2.key, t2.value
FROM htable t1
CROSS JOIN unnest (
array['c1', 'c2', 'c3'],
array[c1, c2, c3]
) t2 (key, value)
3.Standard SQL
代码如下:
SELECT uid, 'c1' AS key, c1 AS value FROM htable
UNION ALL
SELECT uid, 'c2' AS key, c2 AS value FROM htable
UNION ALL
SELECT uid, 'c3' AS key, c3 AS value FROM htable
补充:UNNEST可以将ARRAY和MAP类型的变量展开成表。其中ARRAY展开为单列的表,MAP展开为双列的表(键,值)。
UNNEST可以一次展开多个ARRAY和MAP类型的变量,在这种情况下,它们被扩展为多个列,行数等于输入参数列表中最大展开行数(其他列用空值填充)。
UNNEST可以有一个WITH ORDINALITY子句,此时,查询结果中会附加一个序数列。
UNNEST通常与JOIN一起使用,并可以引用join左侧的关系的列。