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

MaxCompute:機能:スキーマレスクエリ

最終更新日:Dec 05, 2025

MaxCompute は、Object Storage Service (OSS) に保存されている Parquet 外部テーブルのデータに対するスキーマレスクエリをサポートしています。解析されたデータセットを OSS にエクスポートしたり、内部テーブルに書き込んだりできます。また、データセットを SQL 操作のサブクエリとして埋め込むことで、データレイク内のデータを簡単に操作できます。

背景情報

Spark を使用して構造化データのアドホックな探索を行う場合、固定のデータウェアハウスモデルに依存する必要はありません。しかし、OSS データの読み書きの前に、入出力のテーブルスキーマを定義し、ファイルフィールドを手動でマッピングし、さらにパーティションを維持する必要がある場合、そのプロセスは煩雑で柔軟性に欠けます。

Parquet 外部テーブルを読み取る際、`LOAD` 命令は自動的にファイル形式を解析し、データをスキーマ付きのデータセットに読み込みます。これにより、特定の列を選択することで、あたかもテーブル内にあるかのようにデータを処理できます。結果は `UNLOAD` コマンドで OSS にエクスポートしたり、`CREATE TABLE AS` を使用して内部テーブルにインポートしたりできます。また、このデータセットを他の SQL 文のサブクエリとして使用することも可能です。これにより、MaxCompute を使用してデータレイク内のデータを柔軟に操作する方法が提供されます。

注意事項

現在、スキーマレスクエリは、OSS バケット内のサブディレクトリをパーティションとして扱うことをサポートしていません

構文

SELECT *, <col_name>, <table_alias>.<col_name> 
FROM 
 LOCATION '<location_path>'  
 ('key'='value' [, 'key1'='value1', ...]) 
 [AS <table_alias>];

パラメーター

パラメーター

必須

説明

*

はい

Parquet ファイル内のすべてのフィールドをクエリします。

col_name

はい

Parquet ファイル内の既知の列名のフィールドをクエリします。

table_alias.col_name

はい

Parquet ファイル内の既知の列名のフィールドをクエリします。テーブルのエイリアスとフィールド名を含む完全なパスで表現されます。

table_alias

いいえ

カスタムのテーブルエイリアス。

location_path

はい

  • Parquet ファイルの場所です。oss://oss_endpoint/bucket_name/path/ という構造の OSS ディレクトリである必要があります。

  • パス配下のレベルは、partition_name=partition_value フォーマットのパーティションディレクトリをサポートします。

  • 現在、スキーマレスクエリはロケーション内のサブディレクトリをパーティションとして扱うことをサポートしていません。そのため、パーティションプルーニングはサポートされていません。

key&value

はい

クエリ文のパラメーターとその値。詳細については、次の表をご参照ください。

key と value パラメーター

key

必須

説明

value

デフォルト値

file_format

はい

ロケーションにあるファイルの形式を指定します。`Parquet` のみがサポートされています。他の形式ではエラーが発生します。

parquet

parquet

rolearn

いいえ

ロケーションへのアクセスに必要な RoleARN を指定します。

説明

SQL 文で RoleARN を指定しない場合、システムはデフォルトで AliyunODPSDefaultRole ロールの ARN を使用します。

acs:ram::xxxxxx:role/aliyunodpsdefaultrole

acs:ram::1234****:role/aliyunodpsdefaultrole

file_pattern_blacklist

いいえ

読み取るファイルのブラックリストを指定します。スキャンされたファイル名がブラックリストに一致する場合、そのファイルは読み取られません。

正規表現。例:

".*_SUCCESS$,.*\\.hive_staging.*"

なし

file_pattern_whitelist

いいえ

読み取るファイルのホワイトリストを指定します。ファイル名がホワイトリストに一致する場合にのみ、そのファイルが読み取られます。

正規表現。例:

".*_20250124_.*.parquet"

.*

例 1:ブラックリストとホワイトリストのパラメーターを設定して OSS データを読み取る

  1. データを準備します。

    1. Object Storage Service (OSS) コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、バケット をクリックします。

    3. バケット ページで、バケットの作成 をクリックします。

    4. OSS バケットに object-table-test/schema/ ディレクトリを作成します。

    5. ホワイトリストパラメーターを読み取って検証するための Parquet ファイルを準備します。ローカルで次の Python コードを実行して、Parquet ファイルを作成できます。

      import pandas as pd
      
      # Sample data
      data = [
          {'id': 3, 'name': 'Charlie', 'age': 35},
          {'id': 4, 'name': 'David', 'age': 40},
          {'id': 5, 'name': 'Eve', 'age': 28}
      ]
      
      df = pd.DataFrame(data)
      
      df['id'] = df['id'].astype('int32')
      df['name'] = df['name'].astype('str')
      df['age'] = df['age'].astype('int32')
      
      output_filename = 'sample_data.parquet'
      df.to_parquet(output_filename, index=False, engine='pyarrow')
      
    6. Parquet ファイルを OSS バケットの object-table-test/schema/ ディレクトリにアップロードします。

      1. Object Storage Service (OSS) コンソールにログインします。

      2. バケットの object-table-test/schema/ ディレクトリで、[オブジェクトのアップロード] をクリックします。

    7. OSS バケットの object-table-test/schema/ ディレクトリに、ブラックリストパラメーターを検証するための CSV ファイルを準備します。

  2. Parquet ファイルを読み取ります。

    MaxCompute クライアント (odpscmd) にログインし、次の SQL コマンドを実行します。

    • test_oss.csv をブラックリストに追加し、OSS から Parquet ファイルを読み取ります。

      SELECT id, name, age 
      FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/'
      (
      'file_format'='parquet',
      'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
      'file_pattern_blacklist'='.*test_oss.*'
      );
    • sample_data をホワイトリストに追加し、OSS から Parquet ファイルを読み取ります。

      SELECT id, name, age 
      FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/'
      (
      'file_format'='parquet',
      'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
      'file_pattern_whitelist'='.*sample_data.*'
      );

    前述のいずれかのパラメーター設定で、 sample_data ファイルが読み取られ、以下の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

例 2:Spark によって書き込まれたデータを読み取る

  1. OSS バケットに object-table-test/spark/ ディレクトリを作成します。

  2. Serverless Spark を使用して Parquet データを生成します。詳細については、「SQL タスクの作成」をご参照ください。Spark によって生成された Parquet ファイルが既に OSS ディレクトリに存在する場合は、このステップをスキップできます。

    1. E-MapReduce コンソールにログインし、左上隅でリージョンを選択します。

    2. 左側のナビゲーションウィンドウで、EMR Serverless > Spark を選択します。

    3. Spark ページで、ターゲットワークスペースの名前をクリックして開きます。ワークスペースの作成 をクリックすることもできます。ワークスペースが作成されたら、新しいワークスペースの名前をクリックして開きます。

    4. 左側のナビゲーションウィンドウで、[開発] を選択し、新しい SparkSQL ファイルを作成し、次の SQL 文を実行します:

      CREATE TABLE example_table_parquet04 (
          id STRING,
          name STRING,
          age STRING,
          salary DOUBLE,
          is_active BOOLEAN,
          created_at TIMESTAMP,
          details STRUCT<department:STRING, position:STRING>
      )
      USING PARQUET;
      
      INSERT INTO example_table_parquet04 VALUES
      ('1', 'Alice', '30', 5000.50, TRUE, TIMESTAMP '2024-01-01 10:00:00', STRUCT('HR', 'Manager')),
      ('2', 'Bob', '25', 6000.75, FALSE, TIMESTAMP '2024-02-01 11:00:00', STRUCT('Engineering', 'Developer')),
      ('3', 'Charlie','35', 7000.00, TRUE, TIMESTAMP '2024-03-01 12:00:00', STRUCT('Marketing', 'Analyst')),
      ('4', 'David', '40', 8000.25, FALSE, TIMESTAMP '2024-04-01 13:00:00', STRUCT('Sales', 'Representative')),
      ('5', 'Eve', '28', 5500.50, TRUE, TIMESTAMP '2024-05-01 14:00:00', STRUCT('Support', 'Technician'));
      
      SELECT * FROM example_table_parquet04;
  3. OSS コンソールにログインし、宛先パスで生成されたデータファイルを表示します。

  4. MaxCompute クライアントにログオンし、_SUCCESS をブラックリストに追加し、OSS から Parquet ファイルを読み取ります。

    SELECT  *
    FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/spark/example_table_parquet04/'
    (
    'file_format'='parquet',
    'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
    'file_pattern_blacklist'='.*_SUCCESS.*'
    );

    次の結果が返されます。

    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
    | id | name    | age | salary     | is_active | created_at          | details                                      |
    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
    | 1  | Alice   | 30  | 5000.5     | true      | 2024-01-01 10:00:00 | {department:HR, position:Manager}            |
    | 2  | Bob     | 25  | 6000.75    | false     | 2024-02-01 11:00:00 | {department:Engineering, position:Developer} |
    | 3  | Charlie | 35  | 7000.0     | true      | 2024-03-01 12:00:00 | {department:Marketing, position:Analyst}     |
    | 4  | David   | 40  | 8000.25    | false     | 2024-04-01 13:00:00 | {department:Sales, position:Representative}  |
    | 5  | Eve     | 28  | 5500.5     | true      | 2024-05-01 14:00:00 | {department:Support, position:Technician}    |
    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+

スキーマレスクエリ操作の詳細については、「スキーマレスクエリを使用してデータレイクから Parquet データを読み取る」をご参照ください。

例 3:スキーマレスクエリをサブクエリとして使用する

  1. データを準備します。

    OSS コンソールにログインし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ object-table-test/schema/ にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。

  2. MaxCompute クライアントにログインし、自動的に検出された OSS データを格納するための内部テーブルを作成します。

    CREATE TABLE ow_test (
        id INT,
        name STRING,
        age INT
    );
  3. スキーマレスクエリを使用して OSS データを読み取ります。コマンドは次のとおりです。

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    次の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  4. OSS から読み取ったデータをサブクエリとして外部 SQL 文に渡し、`ow_test` 結果テーブルをクエリできます。

    INSERT OVERWRITE TABLE ow_test
    SELECT id,name,age FROM 
    (
        SELECT * FROM 
        LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
        (
          'file_format'='parquet'
        )
    );
    
    SELECT * FROM ow_test;

    次の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

例 4:スキーマレスクエリの結果を内部データウェアハウスのテーブルに保存する

  1. データを準備します。

    OSS コンソールにログインし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ object-table-test/schema/ にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。

  2. MaxCompute クライアントにログインし、スキーマレスクエリを使用して OSS データを読み取ります。

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    次の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. 自動的に検出された OSS データを CREATE TABLE AS 文を使用して内部テーブルにコピーし、結果をクエリします。

    CREATE TABLE ow_test_2 AS 
      SELECT * FROM 
      LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
      (
        'file_format'='parquet'
       );
    
    -- Query the result table ow_test_2
    SELECT * FROM ow_test_2;

    次の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

例 5:スキーマレスクエリの結果をデータレイクにアンロードする

  1. データを準備します。

    OSS コンソールにログオンし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ object-table-test/schema/ にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。

  2. MaxCompute クライアントにログインし、スキーマレスクエリを使用して OSS データを読み取ります。

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    次の結果が返されます。

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. 自動的に検出された結果を OSS にアンロードします。`UNLOAD` 操作の詳細については、「UNLOAD」をご参照ください。

    UNLOAD FROM (
      SELECT * FROM 
      LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
      ('file_format'='parquet')
    ) 
    INTO 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/unload/ow_test_3/'
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    WITH SERDEPROPERTIES ('odps.external.data.enable.extension'='true')
    STORED AS PARQUET;

    OSS ディレクトリで生成されたファイルを表示します。image