メインコンテンツまでスキップ

ファイルパスパターン

概要

リモートストレージシステム(S3、HDFS、およびその他のS3互換オブジェクトストレージ)からファイルにアクセスする際、Dorisはワイルドカードや範囲表現を含む柔軟なファイルパスパターンをサポートします。このドキュメントでは、サポートされるパス形式とパターンマッチング構文について説明します。

これらのパスパターンは以下でサポートされています:

サポートされるURI形式

S3形式のURI

形式フォーマット
AWS Client Style (Hadoop S3)s3://bucket/path/to/files3://my-bucket/data/file.csv
S3A Styles3a://bucket/path/to/files3a://my-bucket/data/file.csv
S3N Styles3n://bucket/path/to/files3n://my-bucket/data/file.csv
Virtual Host Stylehttps://bucket.endpoint/path/to/filehttps://my-bucket.s3.us-west-1.amazonaws.com/data/file.csv
Path Stylehttps://endpoint/bucket/path/to/filehttps://s3.us-west-1.amazonaws.com/my-bucket/data/file.csv

その他のクラウドストレージURI

プロバイダースキーム
Alibaba Cloud OSSoss://oss://my-bucket/data/file.csv
Tencent Cloud COScos://, cosn://cos://my-bucket/data/file.csv
Baidu Cloud BOSbos://bos://my-bucket/data/file.csv
Huawei Cloud OBSobs://obs://my-bucket/data/file.csv
Google Cloud Storagegs://gs://my-bucket/data/file.csv
Azure Blob Storageazure://azure://container/data/file.csv

HDFS URI

形式フォーマット
標準hdfs://namenode:port/path/to/filehdfs://namenode:8020/user/data/file.csv
HAモードhdfs://nameservice/path/to/filehdfs://my-ha-cluster/user/data/file.csv

ワイルドカードパターン

Dorisはファイルパスにglob形式のパターンマッチングを使用します。以下のワイルドカードがサポートされています:

基本ワイルドカード

パターン説明マッチするもの
*パスセグメント内の0文字以上の文字にマッチ*.csvfile.csvdata.csva.csv
?正確に1文字にマッチfile?.csvfile1.csvfileA.csvだがfile10.csvはマッチしない
[abc]ブラケット内の任意の1文字にマッチfile[123].csvfile1.csvfile2.csvfile3.csv
[a-z]範囲内の任意の1文字にマッチfile[a-c].csvfilea.csvfileb.csvfilec.csv
[!abc]ブラケット内にない任意の1文字にマッチfile[!0-9].csvfilea.csvfileb.csvだがfile1.csvはマッチしない

範囲展開(ブレースパターン)

Dorisはブレースパターン{start..end}を使用した数値範囲展開をサポートします:

パターン展開マッチするもの
{1..3}{1,2,3}123
{01..05}{1,2,3,4,5}12345(先頭のゼロは保持されない)
{3..1}{1,2,3}123(逆順範囲がサポートされる)
{a,b,c}{a,b,c}abc(列挙)
{1..3,5,7..9}{1,2,3,5,7,8,9}範囲と値の混在
注意
  • Dorisは可能な限り多くのファイルをマッチしようとします。ブレース表現内の無効な部分は静かにスキップされ、有効な部分は引き続き展開されます。例えば、file_{a..b,-1..3,4..5}file_4file_5にマッチします(無効なa..bと負の範囲-1..3はスキップされますが、4..5は正常に展開されます)。
  • 全体の範囲が負の場合(例:{-1..2})、その範囲はスキップされます。有効な範囲と混在している場合(例:{-1..2,1..3})、有効な範囲1..3のみが展開されます。
  • 範囲でカンマ区切りの値を使用する場合、数値のみが許可されます。例えば、{1..4,a}では、非数値のaは無視され、結果として{1,2,3,4}になります。
  • {a,b,c}のような純粋な列挙パターン(..範囲を含まない)は直接glob マッチングに渡され、期待通りに動作します。

パターンの組み合わせ

複数のパターンを1つのパスに組み合わせることができます:

s3://bucket/data_{1..3}/file_*.csv

これは以下にマッチします:

  • s3://bucket/data_1/file_a.csv
  • s3://bucket/data_1/file_b.csv
  • s3://bucket/data_2/file_a.csv
  • ... など

S3 TVF の例

ディレクトリ内のすべてのCSVファイルにマッチ:

SELECT * FROM S3(
"uri" = "s3://my-bucket/data/*.csv",
"s3.access_key" = "xxx",
"s3.secret_key" = "xxx",
"s3.region" = "us-east-1",
"format" = "csv"
);

数値範囲でファイルをマッチ:

SELECT * FROM S3(
"uri" = "s3://my-bucket/logs/data_{1..10}.csv",
"s3.access_key" = "xxx",
"s3.secret_key" = "xxx",
"s3.region" = "us-east-1",
"format" = "csv"
);

日付でパーティション分けされたディレクトリ内のファイルをマッチ:

SELECT * FROM S3(
"uri" = "s3://my-bucket/logs/year=2024/month=*/day=*/data.parquet",
"s3.access_key" = "xxx",
"s3.secret_key" = "xxx",
"s3.region" = "us-east-1",
"format" = "parquet"
);
ゼロパディングされたディレクトリ

month=01month=02のようなゼロパディングされたディレクトリ名の場合は、範囲パターンではなくワイルドカード(*)を使用してください。パターン{01..12}{1,2,...,12}に展開されるため、month=01にマッチしません。

番号付きファイル分割にマッチさせる(例:Spark出力):

SELECT * FROM S3(
"uri" = "s3://my-bucket/output/part-{00000..00099}.csv",
"s3.access_key" = "xxx",
"s3.secret_key" = "xxx",
"s3.region" = "us-east-1",
"format" = "csv"
);

Broker Load Examples

パターンにマッチするすべてのCSVファイルを読み込む:

LOAD LABEL db.label_wildcard
(
DATA INFILE("s3://my-bucket/data/file_*.csv")
INTO TABLE my_table
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(col1, col2, col3)
)
WITH S3 (
"provider" = "S3",
"AWS_ENDPOINT" = "s3.us-west-2.amazonaws.com",
"AWS_ACCESS_KEY" = "xxx",
"AWS_SECRET_KEY" = "xxx",
"AWS_REGION" = "us-west-2"
);

数値範囲展開を使用してファイルを読み込む:

LOAD LABEL db.label_range
(
DATA INFILE("s3://my-bucket/exports/data_{1..5}.csv")
INTO TABLE my_table
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(col1, col2, col3)
)
WITH S3 (
"provider" = "S3",
"AWS_ENDPOINT" = "s3.us-west-2.amazonaws.com",
"AWS_ACCESS_KEY" = "xxx",
"AWS_SECRET_KEY" = "xxx",
"AWS_REGION" = "us-west-2"
);

ワイルドカードを使用してHDFSから読み込み:

LOAD LABEL db.label_hdfs_wildcard
(
DATA INFILE("hdfs://namenode:8020/user/data/2024-*/*.csv")
INTO TABLE my_table
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(col1, col2, col3)
)
WITH HDFS (
"fs.defaultFS" = "hdfs://namenode:8020",
"hadoop.username" = "user"
);

数値範囲でHDFSから読み込み:

LOAD LABEL db.label_hdfs_range
(
DATA INFILE("hdfs://namenode:8020/data/file_{1..3,5,7..9}.csv")
INTO TABLE my_table
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(col1, col2, col3)
)
WITH HDFS (
"fs.defaultFS" = "hdfs://namenode:8020",
"hadoop.username" = "user"
);

INSERT INTO SELECT の例

ワイルドカードを使用したS3からの挿入:

INSERT INTO my_table (col1, col2, col3)
SELECT * FROM S3(
"uri" = "s3://my-bucket/data/part-*.parquet",
"s3.access_key" = "xxx",
"s3.secret_key" = "xxx",
"s3.region" = "us-east-1",
"format" = "parquet"
);

パフォーマンスに関する考慮事項

具体的なプレフィックスを使用する

Dorisは、S3/HDFSリスト操作を最適化するために、パスパターンから最長の非ワイルドカードプレフィックスを抽出します。より具体的なプレフィックスを使用することで、ファイル検出が高速化されます。

-- Good: specific prefix reduces listing scope
"uri" = "s3://bucket/data/2024/01/15/*.csv"

-- Less optimal: broad wildcard at early path segment
"uri" = "s3://bucket/data/**/file.csv"

既知のシーケンスにはレンジパターンを優先する

正確なファイル番号がわかっている場合は、ワイルドカードの代わりにレンジパターンを使用してください:

-- Better: explicit range
"uri" = "s3://bucket/data/part-{0001..0100}.csv"

-- Less optimal: wildcard matches unknown files
"uri" = "s3://bucket/data/part-*.csv"

深い再帰的ワイルドカードを避ける

** のような深い再帰的パターンは、大きなバケットでファイルリストの処理が遅くなる原因となります:

-- Avoid when possible
"uri" = "s3://bucket/**/*.csv"

-- Prefer explicit path structure
"uri" = "s3://bucket/data/year=*/month=*/day=*/*.csv"

トラブルシューティング

問題原因解決策
ファイルが見つからないパターンがどのファイルにもマッチしないパスとパターンの構文を確認し、まず単一ファイルでテストする
ファイル一覧の処理が遅いワイルドカードが広範囲すぎる、またはファイルが多すぎるより具体的なプレフィックスを使用し、ワイルドカードのスコープを制限する
無効なURI errorパス構文の形式が正しくないURIスキームとbucket名の形式を確認する
Access denied認証情報または権限の問題S3/HDFS認証情報とbucketポリシーを確認する

パスパターンのテスト

大規模なロードジョブを実行する前に、制限されたクエリでパターンをテストしてください:

-- Test if files exist and match pattern
SELECT * FROM S3(
"uri" = "s3://bucket/your/pattern/*.csv",
...
) LIMIT 1;

マッチしたファイルのスキーマを検証するには DESC FUNCTION を使用します:

DESC FUNCTION S3(
"uri" = "s3://bucket/your/pattern/*.csv",
...
);