MaxComputeが提供するTABLESAMPLE機能を使用して、テーブルデータをサンプリングできます。 この機能は、バケットベースのサンプリング、パーセンテージベースのサンプリング、およびランダムサンプリングの3つのサンプリング方法を提供します。 パーセンテージベースのサンプリングを使用すると、指定されたパーセンテージに基づいてレコードが返されます。 ランダムサンプリングを使用すると、指定した数のランダムレコードが返されます。 このトピックでは、TABLESAMPLEの構文について説明し、TABLESAMPLEの使用方法の例を示します。
構文
バケットベースのサンプリング
TABLESAMPLE (BUCKET <x> OUT OF <y> [ON <col_name> | rand()])パラメータ説明
xおよびy: 必須。 ソーステーブルのデータは、1から番号が付けられたy個のバケットに分割されます。 x番目のバケット内のデータがサンプリングされる。
col_name: データをサンプリングする列の名前。 テーブルがクラスタ化テーブルでない場合は、
col_nameまたはrand()関数を使用する必要があります。rand()関数を使用すると、入力データはランダムにバケットに分割されます。ON句には最大10列を指定できます。
パーセンテージベースのサンプリング
TABLESAMPLE (<n> PERCENT)上記の構文では、
nはサンプリングパーセンテージ値を指定します。 パーセンテージベースのサンプリングが使用される場合、データのn %がサンプリングされる。 これは、ソーステーブル内のすべてのレコードに返されるレコードの割合が約n %であることを示しています。 パーセント値は絶対に正確ではありません。ランダムサンプリング
TABLESAMPLE (<m> ROWS)mは、返されるレコードの数を指定します。 ソーステーブル内のレコードの総数が値m未満の場合、ソーステーブル内のすべてのレコードが返されます。mの最大値は10000である。
サンプルデータ
次のサンプルテーブルが使用されます。
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020テーブルは、MaxComputeパブリックデータセットのテーブルです。 パブリックデータセットの詳細については、「概要」をご参照ください。tblsample_test
tblsample_testテーブルはクラスタ化されたテーブルです。 次のCREATE TABLEおよびINSERT OVERWRITEステートメントを使用して、テーブルを作成し、テーブルにデータを挿入します。-- Create the tblsample_test table. CREATE TABLE tblsample_test(a bigint, b string, c string) CLUSTERED BY (a, c) SORTED by (a, c) INTO 32 BUCKETS; -- Insert data into the table. insert overwrite table tblsample_test values(1,"b1","c1"), (2,"b2","c2"), (3,"b3","c3"), (4,"b4","c4"); -- Query data from the table. select * from tblsample_test; -- The following result is returned: +------------+---+-----+ | a | b | c | +------------+---+-----+ | 2 | b2 | c2 | | 4 | b4 | c4 | | 3 | b3 | c3 | | 1 | b1 | c1 | +------------+---+---+
例
例1: 指定したバケットの列値とサンプルデータに基づいて、入力データをバケットに分割します。
-- Sample data from the BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 table. SELECT isp_code, phoneno, province FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 TABLESAMPLE (BUCKET 1 OUT of 1000000 ON isp_code, phoneno, province) s; -- The following result is returned: +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 185 | 1853500 | Shanxi | | 187 | 1878332 | Sichuan | +----------+---------+----------+例2:
RAND()関数を使用して、入力データをランダムにバケットに分割し、指定したバケットのデータをサンプリングします。-- Sample data from the BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 table. SELECT isp_code, phoneno, province FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 TABLESAMPLE (BUCKET 3 OUT OF 500000 ON RAND()) s; -- The following result is returned: +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 131 | 1312224 | Shanghai | | 135 | 1353936 | Guangdong | | 158 | 1586377 | Shandong | +----------+---------+----------+例3:
ON句を指定せずにtblsample_testテーブルからデータをサンプリングします。select a, b from tblsample_test TABLESAMPLE (BUCKET 1 OUT OF 2) as ts; -- The following result is returned: +------------+---+ | a | b | +------------+---+ | 2 | b2| +------------+---+説明クラスタ化テーブルのデータはバケットに格納されます。 したがって、データはサンプリング中にバケットから直接取得されます。 このようにして、サンプリング性能が改善される。
tblsample_testテーブルは、テーブルの作成時に32個のバケットに分割されます。 データをサンプリングする場合、yの値が32の倍数 (32、64、128など) であるか、32がyの値 (16、8、4など) で割り切れる場合、サンプリングパフォーマンスを向上させることができます。例4: tblsample_testテーブルから
n %のデータをサンプリングします。 この例では、ソーステーブル内のすべてのレコードに対するサンプリングされたレコードの割合は約n %です。 パーセント値は絶対に正確ではありません。-- Sample 50% of data from the tblsample_test table. SELECT * FROM tblsample_test TABLESAMPLE (50 PERCENT) s; -- The following result is returned: +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+例5: tblsample_testテーブルから
n個のレコードをサンプリングします。select * FROM tblsample_test TABLESAMPLE (2 ROWS); -- The following result is returned: +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+