Hive之側視圖(Lateral View)

  • Lateral View和UDTF類功能函數一塊兒使用,表中的每一行和UDTF函數輸出的每一行進行鏈接,生成一張新的虛擬表,能夠對UDTF產生的記錄設置字段名稱,新加的字段能夠使用在sort by,group by等語句中,不須要再套一層子查詢。Lateral View的做用是能夠擴展原來的表數據。
  • Lateral View Syntax:
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
  • 示例準備
# 建立表
create table lateral_test(
  name string,
  course string,
  hobby string
)
row format delimited
fields terminated by '\t'
lines terminated by '\n';

# 樣例數據
[root@wadeyu ~]# cat lateral_test.log 
wadeyu  c1,c2,c3    basketball,tennis
tom c2,c3,c5    swimming,trip
polly   c1,c2,c3    sz

# 查詢數據
0: jdbc:hive2://> select * from lateral_test;
OK
+--------------------+----------------------+---------------------+--+
| lateral_test.name  | lateral_test.course  | lateral_test.hobby  |
+--------------------+----------------------+---------------------+--+
| wadeyu             | c1,c2,c3             | basketball,tennis   |
| tom                | c2,c3,c5             | swimming,trip       |
| polly              | c1,c2,c3             | sz                  |
+--------------------+----------------------+---------------------+--+
3 rows selected (0.511 seconds)
  • 示例一:單個Lateral View
select 
  name, 
  course, 
  t_hobby.hobby 
from lateral_test 
lateral view explode(split(hobby, ',')) t_hobby as hobby;

OK
+---------+-----------+----------------+--+
|  name   |  course   | t_hobby.hobby  |
+---------+-----------+----------------+--+
| wadeyu  | c1,c2,c3  | basketball     |
| wadeyu  | c1,c2,c3  | tennis         |
| tom     | c2,c3,c5  | swimming       |
| tom     | c2,c3,c5  | trip           |
| polly   | c1,c2,c3  | sz             |
+---------+-----------+----------------+--+
5 rows selected (0.535 seconds)
  • 示例二:多個Lateral View
    • Lateral View左邊的字段均可以使用
select 
  name, 
  t_course.course, 
  t_hobby.hobby 
from lateral_test 
lateral view explode(split(course, ',')) t_course as course 
lateral view explode(split(hobby, ',')) t_hobby as hobby;

+---------+------------------+----------------+--+
|  name   | t_course.course  | t_hobby.hobby  |
+---------+------------------+----------------+--+
| wadeyu  | c1               | basketball     |
| wadeyu  | c1               | tennis         |
| wadeyu  | c2               | basketball     |
| wadeyu  | c2               | tennis         |
| wadeyu  | c3               | basketball     |
| wadeyu  | c3               | tennis         |
| tom     | c2               | swimming       |
| tom     | c2               | trip           |
| tom     | c3               | swimming       |
| tom     | c3               | trip           |
| tom     | c5               | swimming       |
| tom     | c5               | trip           |
| polly   | c1               | sz             |
| polly   | c2               | sz             |
| polly   | c3               | sz             |
+---------+------------------+----------------+--+
15 rows selected (0.521 seconds)
  • 示例三:Outer Lateral View
    • UDTF未產生行時,鏈接結果爲空,若是想輸入的行也輸出,須要加上Outer關鍵字
# 未加Outer關鍵字,輸出內容爲空
select 
  name,
  course,
  col1
from lateral_test
lateral view explode(array()) et as col1;

+-------+---------+-------+--+
| name  | course  | col1  |
+-------+---------+-------+--+
+-------+---------+-------+--+
No rows selected (0.499 seconds)

# 加上Outer關鍵字,輸出不爲空
select 
  name,
  course,
  col1
from lateral_test
lateral view outer explode(array()) et as col1;

+---------+-----------+-------+--+
|  name   |  course   | col1  |
+---------+-----------+-------+--+
| wadeyu  | c1,c2,c3  | NULL  |
| tom     | c2,c3,c5  | NULL  |
| polly   | c1,c2,c3  | NULL  |
+---------+-----------+-------+--+
3 rows selected (0.543 seconds)

參考資料

【0】Hive wiki - LanguageManual LateralViewexpress

相關文章
相關標籤/搜索