すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Lateral View

最終更新日:Dec 09, 2024

MaxComputeでは、LATERAL VIEW句とユーザー定義のテーブル値関数 (UDTF) を使用して、1行のデータを複数行のデータに分割できます。 このトピックでは、LITERAL VIEW句を使用してデータの行を分割し、分割したデータを集約する方法について説明します。

概要

SELECTステートメントでUDTFを直接使用すると、問題が発生する可能性があります。 これらの問題に対処するには、UDTFでLATERAL VIEW句を使用して、データの行を複数の行に分割し、分割されたデータを集計します。

LATERAL VIEW句にlateral view outer ... などのキーワード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: 必須です。 このパラメータは、ソーステーブルの名前を指定します。

    説明

    複数のLATERAL VIEW句がFROM句に続く場合があります。 LATERAL VIEW句は、FROM句の前にリストされているテーブルおよび列のエイリアスを参照できます。 これは、行データを異なる列に分割することを目的とする。

サンプルデータ

たとえば、pageAdsテーブルには3つの列があります。 最初の列はpageid文字列です。 2番目の列はcol1 array<int> です。 3番目の列は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つ使用します。

    • 例1: LATERAL VIEW句を使用して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: LATERAL VIEW句を使用して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句を使用します。

    複数の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          
    +------------+------------+------------+

関連ドキュメント

ビジネス開発中にデータを行から列に、または列から行に転置するには、行を列に、または列を行に転置するためのベストプラクティスの例を表示することもできます。