全部產品
Search
文件中心

MaxCompute:Lateral View

更新時間:Jun 19, 2024

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>,詳細資料如下。
pageidcol1col2
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          |
      +------------+------------+
  • 多個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方法外,還可以參見行轉列及列轉行最佳實務