MaxCompute支持通過Lateral View與UDTF(表生成函數)結合,將單行數據拆成多行數據。本文為您介紹如何使用Lateral View拆分行數據,并執行聚合操作。
功能介紹
直接在select
語句中使用UDTF會存在限制,為解決此問題,您可以通過MaxCompute的Lateral View與UDTF結合使用,將一行數據拆成多行數據,并對拆分后的數據進行聚合。
當Lateral View命令格式中含有outer
關鍵字(即lateral view outer ...
),您定義的UDTF不輸出任何一行時,對應的輸入行在Lateral View結果中依然保留,且所有UDTF輸出列為NULL。
命令格式
lateralView: lateral view [outer] <udtf_name>(<expression>) <table_alias> as <columnAlias> (',' <columnAlias>)
fromClause: from <baseTable> (lateralView) [(lateralView) ...]
- udtf_name:必填。將一行數據拆成多行數據的UDTF,請參見其他函數。
- expression:必填。待拆分行數據所屬列名。
- table_alias:必填。UDTF結果集的別名。
- columnAlias:必填。拆分后得到的列的別名。
- baseTable:必填。數據源表。說明
from
后可以有多個Lateral View語句,后面的Lateral View語句能夠引用它前面的所有表和列名,實現對不同列的行數據進行拆分。
示例數據
假設已有一張表pageAds,它有三列數據,第一列是pageid string,第二列是col1 array<int>,第三列是col2 array<string>,詳細數據如下。
pageid | col1 | col2 |
---|---|---|
front_page | [1, 2, 3] | [“a”, “b”, “c”] |
contact_page | [3, 4, 5] | [“d”, “e”, “f”] |
使用示例
- 單個Lateral View語句
- 示例1:拆分col1。命令示例如下:
返回結果如下:select pageid, col1_new, col2 from pageAds lateral view explode(col1) adTable as col1_new;
+------------+------------+------------+ | pageid | col1_new | col2 | +------------+------------+------------+ | front_page | 1 | ["a","b","c"] | | front_page | 2 | ["a","b","c"] | | front_page | 3 | ["a","b","c"] | | contact_page | 3 | ["d","e","f"] | | contact_page | 4 | ["d","e","f"] | | contact_page | 5 | ["d","e","f"] | +------------+------------+------------+
- 示例2:拆分col1并執行聚合統計。命令示例如下:
返回結果如下:select col1_new, count(1) as count from pageAds lateral view explode(col1) adTable as col1_new group by col1_new;
+------------+------------+ | col1_new | count | +------------+------------+ | 1 | 1 | | 2 | 1 | | 3 | 2 | | 4 | 1 | | 5 | 1 | +------------+------------+
- 示例1:拆分col1。命令示例如下:
- 多個Lateral View語句拆分col1和col2。命令示例如下:
返回結果如下:select pageid,mycol1, mycol2 from pageAds lateral view explode(col1) myTable1 as mycol1 lateral view explode(col2) myTable2 as mycol2;
+------------+------------+------------+ | pageid | mycol1 | mycol2 | +------------+------------+------------+ | front_page | 1 | a | | front_page | 1 | b | | front_page | 1 | c | | front_page | 2 | a | | front_page | 2 | b | | front_page | 2 | c | | front_page | 3 | a | | front_page | 3 | b | | front_page | 3 | c | | contact_page | 3 | d | | contact_page | 3 | e | | contact_page | 3 | f | | contact_page | 4 | d | | contact_page | 4 | e | | contact_page | 4 | f | | contact_page | 5 | d | | contact_page | 5 | e | | contact_page | 5 | f | +------------+------------+------------+
相關參考
在實際業務開發過程中,如果您遇到行轉列或列轉行需求,除了可以借鑒上述Lateral View方法外,還可以參見行轉列及列轉行最佳實踐。