SQL实用技巧-行列转换( 二 )


lateral view为侧视图,意义是为了配合UDTF来使用,把某一行数据拆分成多行数据 。
Hive中不加lateral view的UDTF只能提取单个字段拆分 。加上lateral view就可以将拆分的单个字段数据与原始表数据关联上 。
LATERAL VIEW [ OUTER ] generator_function ( expression [ , ... ] ) [ table_alias ] AS column_alias [ , ... ] 参数
是否必选
说明
generator_function

将一行数据拆成多行数据的UDTF (EXPLODE, INLINE等)
table_alias

UDTF结果的别名
columnAlias

拆分后得到的列的别名
直接看如何利用lateral view实现列转行 。
selectproduct, t_view.month, t_view.salesfromsales_columnlateral view explode(map('2024-01', month_01, '2024-02', month_02, '2024-03', month_03)) t_view as month, sales其中explode(map('2024-01', month_01, '2024-02', month_02, '2024-03', month_03))把map分解成多行 。
lateral view同时指定了这个侧视的表名t_view和两列的列名month 、sales 。
lateral view explode(map('2024-01', month_01, '2024-02', month_02, '2024-03', month_03)) t_view as month, sales# 模拟结果,lateral view不能单独使用month sales2024-01 10002024-02 11002024-03 12002024-01 11002024-02 10002024-03 1400此时select product, t_view.month, t_view.sales就能达成UDTF拆分的单个字段数据与原始表数据关联的效果了 。
selectproduct, t_view.month, t_view.salesfromsales_column# 结果product month salesA 2024-01 1000A 2024-02 1100A 2024-03 1200B 2024-01 1100B 2024-02 1000B 2024-03 1400使用UNPIVOT适用场景:Spark 3.4+ 。
UNPIVOT关键字对于指定的每一组列 , 都会生成对应的行 。其中UNPIVOT关键字是FROM子句的一部分,可以和JOIN关键字等其他关键字一同使用 。
SELECT ...FROM ...UNPIVOT (<new column of value> [, <new column of value>] ...FOR (<new column of name> [, <new column of name>] ...)IN ((<column> [, <column>] ...) [AS (<column value> [, <column value>] ...)][, (<column> [, <column>] ...) [AS (<column value> [, <column value>] ...)]]...))[...]参数说明如下:
参数
是否必选
说明
new column of value

转换后新生成的列名称 , 该列的值由指定转换为行的列的值填充 。
new column of name

转换后新生成的列名称,该列的值由指定转换为行的列名称填充 。
column

指定转换为行的列名称 , 列的名称用来填充new column of name;列的值用来填充new column of value 。
column value

指定转换为行的列的别名
也是直接看示例:
select*fromsales_column UNPIVOT (sales for month in (month_01 as '2024-01', month_02 as '2024-02', month_03 as '2024-03'))sales for month in (month_01, month_02, month_03)的意思就是生成一个新列sales,这一列的值是month_01, month_02, month_03这三列的值 。
生成一个新列month,这里一列的值是month_01, month_02, month_03这三列的列名,即'2024-01',  '2024-02', '2024-03' 。

【SQL实用技巧-行列转换】


推荐阅读