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 | はい |
|
key&value | はい | クエリ文のパラメーターとその値。詳細については、次の表をご参照ください。 |
key と value パラメーター
key | 必須 | 説明 | value | デフォルト値 |
file_format | はい | ロケーションにあるファイルの形式を指定します。`Parquet` のみがサポートされています。他の形式ではエラーが発生します。 | parquet | parquet |
rolearn | いいえ | ロケーションへのアクセスに必要な RoleARN を指定します。
説明 SQL 文で RoleARN を指定しない場合、システムはデフォルトで |
| acs:ram::1234****:role/aliyunodpsdefaultrole |
file_pattern_blacklist | いいえ | 読み取るファイルのブラックリストを指定します。スキャンされたファイル名がブラックリストに一致する場合、そのファイルは読み取られません。 | 正規表現。例:
| なし |
file_pattern_whitelist | いいえ | 読み取るファイルのホワイトリストを指定します。ファイル名がホワイトリストに一致する場合にのみ、そのファイルが読み取られます。 | 正規表現。例:
|
|
例
例 1:ブラックリストとホワイトリストのパラメーターを設定して OSS データを読み取る
データを準備します。
Object Storage Service (OSS) コンソールにログインします。
左側のナビゲーションウィンドウで、バケット をクリックします。
バケット ページで、バケットの作成 をクリックします。
OSS バケットに
object-table-test/schema/ディレクトリを作成します。ホワイトリストパラメーターを読み取って検証するための 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')Parquet ファイルを OSS バケットの
object-table-test/schema/ディレクトリにアップロードします。Object Storage Service (OSS) コンソールにログインします。
バケットの
object-table-test/schema/ディレクトリで、[オブジェクトのアップロード] をクリックします。
OSS バケットの
object-table-test/schema/ディレクトリに、ブラックリストパラメーターを検証するための CSV ファイルを準備します。
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 によって書き込まれたデータを読み取る
OSS バケットに
object-table-test/spark/ディレクトリを作成します。Serverless Spark を使用して Parquet データを生成します。詳細については、「SQL タスクの作成」をご参照ください。Spark によって生成された Parquet ファイルが既に OSS ディレクトリに存在する場合は、このステップをスキップできます。
E-MapReduce コンソールにログインし、左上隅でリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
Spark ページで、ターゲットワークスペースの名前をクリックして開きます。ワークスペースの作成 をクリックすることもできます。ワークスペースが作成されたら、新しいワークスペースの名前をクリックして開きます。
左側のナビゲーションウィンドウで、[開発] を選択し、新しい 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;
OSS コンソールにログインし、宛先パスで生成されたデータファイルを表示します。
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:スキーマレスクエリをサブクエリとして使用する
データを準備します。
OSS コンソールにログインし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ
object-table-test/schema/にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。MaxCompute クライアントにログインし、自動的に検出された OSS データを格納するための内部テーブルを作成します。
CREATE TABLE ow_test ( id INT, name STRING, age INT );スキーマレスクエリを使用して 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 | +------------+------------+------------+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:スキーマレスクエリの結果を内部データウェアハウスのテーブルに保存する
データを準備します。
OSS コンソールにログインし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ
object-table-test/schema/にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。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 | +------------+------------+------------+自動的に検出された 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:スキーマレスクエリの結果をデータレイクにアンロードする
データを準備します。
OSS コンソールにログオンし、テストデータファイル part-00001.snappy.parquet を指定された OSS バケットディレクトリ
object-table-test/schema/にアップロードします。詳細については、「OSS にファイルをアップロードする」をご参照ください。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 | +------------+------------+------------+自動的に検出された結果を 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 ディレクトリで生成されたファイルを表示します。
