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

MaxCompute:TABLESAMPLE

最終更新日:Dec 09, 2024

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 |
    +------------+---+---+