我们知道数仓不满足第一范式,也就是说数仓中的字段是可再分的,不满足原子性,即DDL可以定义一个字段类型为数组。因此才有了explode()函数,用于给这个字段展开降维。
explode()可以把指定的数组字段拆分降维展开为多行。类似于UDTF函数,作用于单/多个数据行,并且产生多个数据行,以一个表作为输出。
explode()用法:
-- array是数组字段 也可以是split()函数
select explode(array) from tablename
但这样无法同时查询多列,即select name,explode(array) from table会报错。
原因时当使用UDTF函数的时候,Hive只允许对拆分字段进行访问。
要同时查询多列只能:
select t.item, t.* from tablename t
lateral view explode(array) t as item
lateral view explode() 是把要拆分的字段array拆分后以多行存储在t表中的item字段中(当然也可以另起一个临时表)。
注意lateral view explode()执行顺序是在from之后where之前,与join on同时执行,所以要紧跟在from语句后。
如果一行数据有两列需要炸裂展开,可以这样写:
select t.item1, t.item2, t.* from tablename t
lateral view explode(array1) t as item1
lateral view explode(array2) t as item2
这样得到的行数是 n * length(array1) * length(array2)