當使用UDTF函數的時候,hive只允許對拆分字段進行訪問的
例如:
select id,explode(arry1) from table; —錯誤
會報錯FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's.
select explode(array1) from table; —正確
但是實際中經常要拆某個字段,然后一起與別的字段一起出.例如上面的id和拆分的array元素是對應的.我們應該如何進行連接呢?我們知道直接select id,explode()是不行的.這個時候就需要lateral view出廠了.
lateral view為側視圖,意義是為了配合UDTF來使用,把某一行數據拆分成多行數據.不加lateral view的UDTF只能提取單個字段拆分,並不能塞會原來數據表中.加上lateral view就可以將拆分的單個字段數據與原始表數據關聯上.
在使用lateral view的時候需要指定視圖別名和生成的新列別名
例如
select id,num from table lateral view explode(array1) subview as num;
subview為視圖別名,num為指定新列別名
lateral view explode 相當於一個拆分array1字段的虛表,然后根據id將其與原表進行笛卡爾積關聯.
我們也可以多次使用lateral view explode
select id,num1,num2 from table
lateral view explode(array1) subview1 as num1
lateral view explode(array2) subview2 as num2
where ...;
我們可以理解為lateral view為table的一個cross join,關聯鍵是table的id
我們在上篇講解的json解析使用到的json_tuple()函數也是UDTF函數,因為一個json字符串對應了解析出n個字段.與原表數據關聯的時候需要使用lateral view
select id from table lateral view json_tuple(property,'tag_id','tag_type’);