S3/HDFSでのファイル分析
Table Value ファンクション (TVF) 機能により、Dorisはデータを事前にインポートすることなく、オブジェクトストレージやHDFS上のファイルを直接Tableとしてクエリおよび分析でき、自動カラム型推論をサポートします。
サポート対象のストレージシステム
Dorisは異なるストレージシステムにアクセスするために以下のTVFを提供します:
| TVF | サポート対象ストレージ | 説明 |
|---|---|---|
| S3 | S3互換オブジェクトストレージ | AWS S3、Alibaba Cloud OSS、Tencent Cloud COSなどをサポート |
| HDFS | HDFS | Hadoop Distributed File Systemをサポート |
使用例
シナリオ1: ファイルの直接クエリと分析
TVFは、最初にDorisにデータをインポートすることなく、ストレージシステム上のファイルを直接分析するのに最適です。
以下の例では、S3 TVFを使用してオブジェクトストレージ上のParquetファイルをクエリします:
SELECT * FROM s3(
'uri' = 's3://bucket/path/to/tvf_test/test.parquet',
'format' = 'parquet',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
's3.access_key' = 'ak',
's3.secret_key' = 'sk'
)
ORDER BY p_partkey LIMIT 5;
クエリ結果の例:
+-----------+------------------------------------------+----------------+----------+-------------------------+--------+-------------+---------------+---------------------+
| p_partkey | p_name | p_mfgr | p_brand | p_type | p_size | p_container | p_retailprice | p_comment |
+-----------+------------------------------------------+----------------+----------+-------------------------+--------+-------------+---------------+---------------------+
| 1 | goldenrod lavender spring chocolate lace | Manufacturer#1 | Brand#13 | PROMO BURNISHED COPPER | 7 | JUMBO PKG | 901 | ly. slyly ironi |
| 2 | blush thistle blue yellow saddle | Manufacturer#1 | Brand#13 | LARGE BRUSHED BRASS | 1 | LG CASE | 902 | lar accounts amo |
| 3 | spring green yellow purple cornsilk | Manufacturer#4 | Brand#42 | STANDARD POLISHED BRASS | 21 | WRAP CASE | 903 | egular deposits hag |
| 4 | cornflower chocolate smoke green pink | Manufacturer#3 | Brand#34 | SMALL PLATED BRASS | 14 | MED DRUM | 904 | p furiously r |
| 5 | forest brown coral puff cream | Manufacturer#3 | Brand#32 | STANDARD POLISHED TIN | 15 | SM PKG | 905 | wake carefully |
+-----------+------------------------------------------+----------------+----------+-------------------------+--------+-------------+---------------+---------------------+
TVFは本質的にはTableであり、SQLステートメントで「Table」が使用できる箇所であればどこでも使用できます。例えば以下のような場所です:
FROM句内- CTEの
WITH句内 JOINステートメント内
シナリオ2:アクセスを簡素化するためのビューの作成
接続情報を繰り返し記述することを避け、権限管理をサポートするために、CREATE VIEWステートメントを使用してTVFの論理ビューを作成できます:
-- Create a view based on TVF
CREATE VIEW tvf_view AS
SELECT * FROM s3(
'uri' = 's3://bucket/path/to/tvf_test/test.parquet',
'format' = 'parquet',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
's3.access_key' = 'ak',
's3.secret_key' = 'sk'
);
-- View the structure of the view
DESC tvf_view;
-- Query the view
SELECT * FROM tvf_view;
-- Grant access to other users
GRANT SELECT_PRIV ON db.tvf_view TO other_user;
シナリオ3: Dorisへのデータインポート
INSERT INTO SELECT構文と組み合わせることで、ファイルデータをDorisTableにインポートできます:
-- 1. Create the target table
CREATE TABLE IF NOT EXISTS test_table
(
id int,
name varchar(50),
age int
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");
-- 2. Import data via TVF
INSERT INTO test_table (id, name, age)
SELECT cast(id as INT) as id, name, cast(age as INT) as age
FROM s3(
'uri' = 's3://bucket/path/to/tvf_test/test.parquet',
'format' = 'parquet',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
's3.access_key' = 'ak',
's3.secret_key' = 'sk'
);
コア機能
マルチファイルマッチング
ファイルパス(URI)では、ワイルドカードおよび範囲パターンを使用して複数のファイルをマッチできます:
| パターン | 例 | マッチ結果 |
|---|---|---|
* | file_* | file_で始まる全てのファイル |
{n..m} | file_{1..3} | file_1、file_2、file_3 |
{a,b,c} | file_{a,b} | file_a、file_b |
完全な構文については、File Path Patternを参照してください。
Resourceを使用した設定の簡素化
TVFはresourceプロパティを通じて事前に作成されたS3またはHDFS Resourcesを参照することをサポートしており、各クエリで接続情報を繰り返し入力する必要がありません。
1. Resourceの作成
CREATE RESOURCE "s3_resource"
PROPERTIES
(
"type" = "s3",
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.access_key" = "ak",
"s3.secret_key" = "sk",
"s3.bucket" = "bucket"
);
2. TVFでResourceを使用する
SELECT * FROM s3(
'uri' = 's3://bucket/path/to/tvf_test/test.parquet',
'format' = 'parquet',
'resource' = 's3_resource'
);
- Resource内のプロパティはデフォルト値として機能します。TVFで指定されたプロパティは、Resource内の同じ名前のプロパティを上書きします
- Resourceを使用することで、接続情報の一元管理が可能になり、メンテナンスと権限制御が容易になります
自動スキーマ推論
DESC FUNCTION構文を使用して、TVFの自動推論されたスキーマを表示できます:
DESC FUNCTION s3 (
"URI" = "s3://bucket/path/to/tvf_test/test.parquet",
"s3.access_key" = "ak",
"s3.secret_key" = "sk",
"format" = "parquet",
"use_path_style" = "true"
);
+---------------+--------------+------+-------+---------+-------+
| Field | タイプ | Null | Key | Default | Extra |
+---------------+--------------+------+-------+---------+-------+
| p_partkey | INT | Yes | false | NULL | NONE |
| p_name | TEXT | Yes | false | NULL | NONE |
| p_mfgr | TEXT | Yes | false | NULL | NONE |
| p_brand | TEXT | Yes | false | NULL | NONE |
| p_type | TEXT | Yes | false | NULL | NONE |
| p_size | INT | Yes | false | NULL | NONE |
| p_container | TEXT | Yes | false | NULL | NONE |
| p_retailprice | DECIMAL(9,0) | Yes | false | NULL | NONE |
| p_comment | TEXT | Yes | false | NULL | NONE |
+---------------+--------------+------+-------+---------+-------+
スキーマ推論ルール:
| ファイル形式 | 推論方法 |
|---|---|
| Parquet、ORC | ファイルメタデータから自動的にスキーマを取得 |
| CSV、JSON | データの最初の行を解析してスキーマを取得;デフォルトの列型はstring |
| 複数ファイルマッチング | 最初のファイルのスキーマを使用 |
列型の手動指定(CSV/JSON)
CSV形式とJSON形式では、csv_schemaプロパティを使用してname1:type1;name2:type2;...の形式で列名と型を手動で指定できます:
S3 (
'uri' = 's3://bucket/path/to/tvf_test/test.csv',
's3.endpoint' = 'https://s3.us-east-1.amazonaws.com',
's3.region' = 'us-east-1',
's3.access_key' = 'ak',
's3.secret_key' = 'sk',
'format' = 'csv',
'column_separator' = '|',
'csv_schema' = 'k1:int;k2:int;k3:int;k4:decimal(38,10)'
)
対応するカラムタイプ:
| Integer Types | Floating-Point Types | Other Types |
|---|---|---|
| tinyint | float | decimal(p,s) |
| smallint | double | date |
| int | datetime | |
| bigint | char | |
| largeint | varchar | |
| string | ||
| boolean |
- カラムタイプが一致しない場合(例:ファイルにはstringが含まれているが
intが指定されている場合)、カラムはnullを返します - カラム数が一致しない場合(例:ファイルに4つのカラムがあるが5つが指定されている場合)、不足しているカラムは
nullを返します
注意事項
| シナリオ | 動作 |
|---|---|
uriがファイルにマッチしないか、すべてのファイルが空の場合 | TVFは空の結果セットを返します。DESC FUNCTIONを使用してスキーマを表示すると、プレースホルダーカラム__dummy_colが表示されます |
| CSVファイルの最初の行が空の場合(ファイルは空ではない) | エラーメッセージ:The first line is empty, can not parse column numbers |