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实用技巧-行列转换】
推荐阅读
- 掌握这八个方法,精通SQL日期函数
- 从MongoDB到PostgreSQL:数据零丢失、成本砍半
- MySQL自增主键一定是连续的吗?
- 《奔跑吧》“跑男变走男”,户外竞技真人秀退出爆款行列
- 怎么进入mysql日志 mysql登录日志文件在哪
- Excel怎么样隐藏列,Excel如何快速隐藏行列
- 5阶行列式的展开式共有多少项
- 小米手机中的隐藏功能和实用技巧
- 告别毛孔粗大!改善毛孔的实用技巧
- MySQL误删数据怎么办?
