Parquet
| Input | Output | Alias |
|---|---|---|
| ✔ | ✔ |
説明
Apache Parquet は、Hadoop エコシステムで広く利用されている列指向ストレージ形式です。ClickHouse は、この形式の読み書きをサポートしています。
データ型の対応
以下の表は、Parquet のデータ型が ClickHouse のデータ型にどのように対応するかを示します。
| Parquet type (logical, converted, or physical) | ClickHouse data type |
|---|---|
BOOLEAN | Bool |
UINT_8 | UInt8 |
INT_8 | Int8 |
UINT_16 | UInt16 |
INT_16 | Int16/Enum16 |
UINT_32 | UInt32 |
INT_32 | Int32 |
UINT_64 | UInt64 |
INT_64 | Int64 |
DATE | Date32 |
TIMESTAMP, TIME | DateTime64 |
FLOAT | Float32 |
DOUBLE | Float64 |
INT96 | DateTime64(9, 'UTC') |
BYTE_ARRAY, UTF8, ENUM, BSON | String |
JSON | JSON |
FIXED_LEN_BYTE_ARRAY | FixedString |
DECIMAL | Decimal |
LIST | Array |
MAP | Map |
| struct | Tuple |
FLOAT16 | Float32 |
UUID | FixedString(16) |
INTERVAL | FixedString(12) |
Parquet ファイルを書き出す際、対応する Parquet 型が存在しないデータ型は、利用可能な最も近い型に変換されます。
| ClickHouse data type | Parquet type |
|---|---|
| IPv4 | UINT_32 |
| IPv6 | FIXED_LEN_BYTE_ARRAY (16 bytes) |
| Date (16 bits) | DATE (32 bits) |
| DateTime (32 bits, seconds) | TIMESTAMP (64 bits, milliseconds) |
| Int128/UInt128/Int256/UInt256 | FIXED_LEN_BYTE_ARRAY (16/32 bytes, little-endian) |
Array は入れ子にでき、引数として Nullable 型の値を持つことができます。Tuple 型および Map 型も入れ子にできます。
ClickHouse テーブルのカラムのデータ型は、挿入される Parquet データ内の対応するフィールドの型と異なる場合があります。データ挿入時、ClickHouse は上記の表に従ってデータ型を解釈し、その後 ClickHouse テーブルのカラムに設定されているデータ型へキャストします。たとえば、UINT_32 の Parquet カラムは IPv4 型の ClickHouse カラムとして読み取ることができます。
一部の Parquet 型には、近い ClickHouse 型が存在しません。これらは次のように読み取ります。
TIME(時刻)はtimestampとして読み取られます。例:10:23:13.000は1970-01-01 10:23:13.000になります。isAdjustedToUTC=falseのTIMESTAMP/TIMEはローカルのウォールクロック時刻(どのタイムゾーンをローカルとみなすかにかかわらず、ローカルタイムゾーンにおける年・月・日・時・分・秒およびサブ秒フィールド)であり、SQL のTIMESTAMP WITHOUT TIME ZONEと同じです。ClickHouse はこれを、あたかも UTC のtimestampであるかのように読み取ります。例:2025-09-29 18:42:13.000(ローカルの時計の読み値を表す)は2025-09-29 18:42:13.000(ある時点を表すDateTime64(3, 'UTC'))になります。String に変換すると、年・月・日・時・分・秒およびサブ秒は正しい値として表示され、それを UTC ではなく何らかのローカルタイムゾーンの時刻として解釈できます。直感に反して、型をDateTime64(3, 'UTC')からDateTime64(3)に変更しても状況は改善しません。どちらの型も時計の読み値ではなくある時点を表すためですが、DateTime64(3)はローカルタイムゾーンを用いて誤ってフォーマットされてしまいます。INTERVALは現在、Parquet ファイル内でエンコードされているとおりの時間間隔の生のバイナリ表現を持つFixedString(12)として読み取られます。
使用例
データの挿入
次のデータを含む football.parquet という名前の Parquet ファイルを使用します:
データを挿入します:
データの読み込み
Parquet 形式でデータを読み込みます。
Parquet はバイナリ形式であり、ターミナル上では人間が読める形で表示されません。Parquet ファイルを出力するには INTO OUTFILE を使用します。
Hadoop とデータを交換するには、HDFS table engine を使用できます。
フォーマット設定
| 設定 | 概要 | デフォルト |
|---|---|---|
input_format_parquet_case_insensitive_column_matching | Parquet の列と CH の列を照合する際に大文字と小文字を区別しません。 | 0 |
input_format_parquet_preserve_order | Parquet ファイルを読み込む際に行の順序を変更しないようにします。通常、処理が大幅に遅くなります。 | 0 |
input_format_parquet_filter_push_down | Parquet ファイルを読み込む際、WHERE/PREWHERE 句と Parquet メタデータ内の最小値/最大値の統計量に基づいて、行グループ全体をスキップします。 | 1 |
input_format_parquet_bloom_filter_push_down | Parquet ファイルを読み込む際、WHERE 句と Parquet メタデータ内のブルームフィルターに基づいて行グループ全体をスキップします。 | 0 |
input_format_parquet_allow_missing_columns | Parquet 入力フォーマットを読み込む際に、存在しないカラムを許可する | 1 |
input_format_parquet_local_file_min_bytes_for_seek | Parquet 入力フォーマットで、データを無視しつつ順次読み込むのではなくシークを行うために必要なローカルファイル読み取りの最小バイト数 | 8192 |
input_format_parquet_enable_row_group_prefetch | Parquet の解析時に行グループのプリフェッチを有効にします。現在は単一スレッドでの解析時にのみプリフェッチが行えます。 | 1 |
input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference | Parquet 形式のスキーマ推論時に、サポートされていない型を持つ列をスキップします。 | 0 |
input_format_parquet_max_block_size | Parquet リーダーの最大ブロックサイズ | 65409 |
input_format_parquet_prefer_block_bytes | Parquet リーダーから出力されるブロックの平均サイズ(バイト単位) | 16744704 |
input_format_parquet_enable_json_parsing | Parquet ファイルを読み込む際は、JSON 列を ClickHouse の JSON カラムとしてパースします。 | 1 |
output_format_parquet_row_group_size | 行グループの目標サイズ(行数単位)。 | 1000000 |
output_format_parquet_row_group_size_bytes | 圧縮前のターゲット行グループのサイズ(バイト単位)。 | 536870912 |
output_format_parquet_string_as_string | String 列には Binary 型ではなく、Parquet の String 型を使用してください。 | 1 |
output_format_parquet_fixed_string_as_fixed_byte_array | FixedString 列には Binary ではなく Parquet の FIXED_LEN_BYTE_ARRAY 型を使用してください。 | 1 |
output_format_parquet_version | 出力フォーマットで使用する Parquet フォーマットのバージョンです。サポートされているバージョンは 1.0、2.4、2.6、および 2.latest(デフォルト)です。 | 2.latest |
output_format_parquet_compression_method | Parquet 出力フォーマットの圧縮方式。サポートされるコーデック:snappy、lz4、brotli、zstd、gzip、none(非圧縮) | zstd |
output_format_parquet_compliant_nested_types | Parquet ファイルのスキーマでは、リスト要素には 'item' ではなく 'element' という名前を使用します。これは Arrow ライブラリの実装に起因する歴史的な経緯によるものです。一般的には互換性が向上しますが、一部の古いバージョンの Arrow とは互換性がない可能性があります。 | 1 |
output_format_parquet_use_custom_encoder | より高速な Parquet エンコーダー実装を使用します。 | 1 |
output_format_parquet_parallel_encoding | 複数スレッドで Parquet エンコードを行う。output_format_parquet_use_custom_encoder を有効にする必要がある。 | 1 |
output_format_parquet_data_page_size | 圧縮前のページの目標サイズ(バイト単位)。 | 1048576 |
output_format_parquet_batch_size | 指定した行数ごとにページサイズをチェックします。カラム内の値の平均サイズが数 KB を超える場合は、この値を小さくすることを検討してください。 | 1024 |
output_format_parquet_write_page_index | Parquet ファイルにページインデックスを書き込めるようにします。 | 1 |
input_format_parquet_import_nested | この設定は廃止されており、指定しても何の効果もありません。 | 0 |
input_format_parquet_local_time_as_utc | true | isAdjustedToUTC=false の Parquet タイムスタンプに対して、スキーマ推論時に使用されるデータ型を決定します。true の場合は DateTime64(..., 'UTC')、false の場合は DateTime64(...) になります。ClickHouse にはローカルの壁時計時刻を表すデータ型がないため、どちらの動作も完全には正しくありません。直感に反して、'true' の方がまだ誤りが少ない選択肢と考えられます。これは、'UTC' タイムスタンプを String 型としてフォーマットすると、正しいローカル時刻を表す文字列表現が得られるためです。 |