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 +------------+------------+------------+
関連ドキュメント
ビジネス開発中にデータを行から列に、または列から行に転置するには、行を列に、または列を行に転置するためのベストプラクティスの例を表示することもできます。