深入理解Hive中的Lateral View及Lateral View Outer的用法

2024-01-08 15:50:10 浏览数 (2)

今天我想和大家分享一下在Hive中,Lateral View和Lateral View Outer的用法,这两者是在处理数据时经常遇到的操作。那么它们到底是什么呢?我们今天就来一探究竟。

1. Lateral View用法

Lateral View是配合表生成函数(如explode)一起使用,对array或者map类型的列进行展开。Hive的lateral view是用来连接生成的虚拟表的。

例如,我们有一个包含数组的表:

代码语言:javascript复制
create table array_table(id int, items array<string>);
insert into array_table(id,items)
values
(1, array('apple', 'banana', 'pear')), 
(2, array('watermelon', 'orange')),
(3, array(null));
代码语言:javascript复制
 ----- ---------------------------- 
| id  |           items            |
 ----- ---------------------------- 
| 1   | ["apple","banana","pear"]  |
| 2   | ["watermelon","orange"]    |
| 3   | NULL                       |
 ----- ---------------------------- 

如果我们想要把items列展开,可以使用lateral view:

代码语言:javascript复制
select id, item
from array_table
lateral view explode(items) tmp as item;

结果会是:

代码语言:javascript复制
 ----- ------------- 
| id  |    item     |
 ----- ------------- 
| 1   | apple       |
| 1   | banana      |
| 1   | pear        |
| 2   | watermelon  |
| 2   | orange      |
 ----- ------------- 

如此可以清晰地看到,Lateral View是用于与复杂数据类型交互的强大工具。

2. Lateral View Outer用法

然而,Lateral View有一个限制——如果在explode的列中有空值,那么它会将包含空值的行完全去掉。这时,我们就可以使用Lateral View Outer。

只需要在lateral view后加上outer,它就会保留那些包含空值的行。如果数组为空,那么explode的结果就会是NULL。

我们使用lateral view outer:

代码语言:javascript复制
select id, item
from array_table
lateral view outer explode(items) tmp as item;

结果会是:

代码语言:javascript复制
 ----- ------------- 
| id  |    item     |
 ----- ------------- 
| 1   | apple       |
| 1   | banana      |
| 1   | pear        |
| 2   | watermelon  |
| 2   | orange      |
| 3   | NULL        |
 ----- ------------- 

你可看到,id为3的行得以保留,不再被忽视。

希望本文的内容可以帮助你更好地理解Hive中的Lateral View和Lateral View Outer的用法。在Hive中处理复杂数据类型时,这两种方法无疑会是你的强大武器。

0 人点赞