Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

file

s3 テーブル関数と同様に、ファイルに対して SELECT したりファイルへ INSERT したりできるテーブル形式インターフェイスを提供するテーブルエンジンです。ローカルファイルを扱う場合は file を使用し、S3、GCS、MinIO などのオブジェクトストレージ内のバケットを扱う場合は s3 を使用します。

file 関数は、ファイルの読み取りや書き込みに SELECT クエリおよび INSERT クエリで使用できます。

構文

file([path_to_archive ::] path [,format] [,structure] [,compression])

SELECT クエリでは、pathArray(String) を返す式を指定することもできます。

file(['file1.csv', 'file2.csv'], 'CSV', 'column1 UInt32, column2 UInt32')

引数

Parameter Description
path user_files_path からのファイルへの相対パス、または SELECT クエリで使用するパスの Array(String) です。読み取り専用モードでは、次の グロブ をサポートします: *, ?, {abc,def} ('abc''def' は文字列) および {N..M} (NM は数値) 。
path_to_archive zip/tar/7z アーカイブへの相対パスです。path と同じ グロブ をサポートします。
format ファイルの フォーマット です。
structure テーブル構造です。形式: 'column1_name column1_type, column2_name column2_type, ...'
compression SELECT クエリで使用する場合は既存の圧縮タイプ、INSERT クエリで使用する場合は目的の圧縮タイプです。サポートされる圧縮タイプは gz, br, xz, zst, lz4, bz2 です。

戻り値

ファイル内のデータを読み書きするためのテーブルです。

File への書き込み例

TSVファイルに書き込む

INSERT INTO TABLE FUNCTION
file('test.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2)

その結果、データはファイル test.tsv に書き込まれます。

# cat /var/lib/clickhouse/user_files/test.tsv
1    2    3
3    2    1
1    3    2

複数のTSVファイルへのパーティション別書き込み

file 型のテーブル関数にデータを挿入する際に PARTITION BY 式を指定すると、パーティションごとに別々のファイルが作成されます。データをファイルごとに分割することで、読み取り処理のパフォーマンス向上に役立ちます。

INSERT INTO TABLE FUNCTION
file('test_{_partition_id}.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
PARTITION BY column3
VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2)

その結果、データは test_1.tsvtest_2.tsvtest_3.tsv の3つのファイルに書き込まれます。

# cat /var/lib/clickhouse/user_files/test_1.tsv
3    2    1

# cat /var/lib/clickhouse/user_files/test_2.tsv
1    3    2

# cat /var/lib/clickhouse/user_files/test_3.tsv
1    2    3

ファイルから読み込む例

CSVファイルからSELECT

まず、サーバー設定で user_files_path を設定し、test.csv ファイルを用意します:

$ grep user_files_path /etc/clickhouse-server/config.xml
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path>

$ cat /var/lib/clickhouse/user_files/test.csv
    1,2,3
    3,2,1
    78,43,45

次に、test.csv からテーブルにデータを読み込み、先頭の2行を取得します:

SELECT * FROM
file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
LIMIT 2;
┌─column1─┬─column2─┬─column3─┐
│       1 │       2 │       3 │
│       3 │       2 │       1 │
└─────────┴─────────┴─────────┘

ファイルからテーブルへデータを挿入する

INSERT INTO FUNCTION
file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
VALUES (1, 2, 3), (3, 2, 1);
SELECT * FROM
file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32');
┌─column1─┬─column2─┬─column3─┐
│       1 │       2 │       3 │
│       3 │       2 │       1 │
└─────────┴─────────┴─────────┘

archive1.zip または archive2.zip に含まれる table.csv からデータを読み取る:

SELECT * FROM file('user_files/archives/archive{1..2}.zip :: table.csv');

パス内のグロブ

パスではグロブを使用できます。ファイルは、接尾辞やプレフィックスだけでなく、パスパターン全体に一致する必要があります。例外が 1 つあり、パスが既存の ディレクトリを指していてグロブを使用していない場合は、* が暗黙的にパスに追加されるため、 ディレクトリ内のすべてのファイルが選択されます。

  • * — 空文字列を含み、/ を除く任意の長さの文字列を表します。
  • ? — 任意の 1 文字を表します。
  • {some_string,another_string,yet_another_one} — 文字列 'some_string''another_string''yet_another_one' のいずれかに置き換えられます。これらの文字列には / 記号を含めることができます。
  • {N..M}>= N かつ <= M の任意の数を表します。
  • ** - フォルダ内のすべてのファイルを再帰的に表します。

{} を使った構文は、remote および hdfs テーブル関数と似ています。

次の相対パスを持つファイルがあるとします。

  • some_dir/some_file_1
  • some_dir/some_file_2
  • some_dir/some_file_3
  • another_dir/some_file_1
  • another_dir/some_file_2
  • another_dir/some_file_3

すべてのファイルに含まれる行数の合計を取得するクエリ:

SELECT count(*) FROM file('{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32');

同じことを実現できる別のパス式:

SELECT count(*) FROM file('{some,another}_dir/*', 'TSV', 'name String, value UInt32');

暗黙の * を使用して、some_dir の総行数をクエリします。

SELECT count(*) FROM file('some_dir', 'TSV', 'name String, value UInt32');

file000file001、…、file999 という名前のファイルの行数の合計をクエリします:

SELECT count(*) FROM file('big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32');

big_dir/ ディレクトリ内のすべてのファイルを再帰的に対象として、合計行数をクエリします:

SELECT count(*) FROM file('big_dir/**', 'CSV', 'name String, value UInt32');

ディレクトリ big_dir/ 内の任意のフォルダにある file002 ファイルすべてを再帰的に対象にして、合計行数をクエリします:

SELECT count(*) FROM file('big_dir/**/file002', 'CSV', 'name String, value UInt32');

仮想カラム

  • _path — ファイルのパス。型: LowCardinality(String).
  • _file — ファイル名。型: LowCardinality(String).
  • _size — ファイルサイズ (バイト単位) 。型: Nullable(UInt64). ファイルサイズが不明な場合、値は NULL です。
  • _time — ファイルの最終更新時刻。型: Nullable(DateTime). 時刻が不明な場合、値は NULL です。

use_hive_partitioning 設定

use_hive_partitioning 設定が 1 に設定されている場合、ClickHouse はパス (/name=value/) 内の Hive スタイルのパーティション化を検出し、クエリでパーティションカラムを仮想カラムとして使用できるようになります。これらの仮想カラムは、パーティション化されたパス内の名前と同じ名前になります。

Hive スタイルのパーティション化で作成された仮想カラムを使用する

SELECT * FROM file('data/path/date=*/country=*/code=*/*.parquet') WHERE date > '2020-01-01' AND country = 'Netherlands' AND code = 42;

設定

Setting Description
engine_file_empty_if_not_exists 存在しないファイルを空データとして扱えるようにします。デフォルトでは無効です。
engine_file_truncate_on_insert ファイルへの insert の前に、そのファイルを切り詰められるようにします。デフォルトでは無効です。
engine_file_allow_create_multiple_files フォーマットに接尾辞がある場合、insert のたびに新しいファイルを作成できるようにします。デフォルトでは無効です。
engine_file_skip_empty_files 読み取り時に空のファイルをスキップできるようにします。デフォルトでは無効です。
storage_file_read_method ストレージファイルからデータを読み取る method です。readpreadmmap のいずれかを指定します (clickhouse-local のみ) 。デフォルト値: clickhouse-server では preadclickhouse-local では mmap
Navigation