Skip to main content

説明

Apache Parquet は、Hadoop エコシステムで広く使われている列指向のストレージフォーマットです。ClickHouse は、このフォーマットの読み取りと書き込みをサポートしています。

データ型の対応

以下の表は、Parquet のデータ型が ClickHouse のデータ型にどのように対応しているかを示しています。 Parquet ファイルへの書き込み時には、対応する Parquet 型がないデータ型は、利用可能な最も近い型に変換されます。 Array はネストでき、引数として Nullable 型の値を取ることもできます。Tuple 型と Map 型もネストできます。 ClickHouse table のカラムのデータ型は、挿入される Parquet data の対応するフィールドと異なる場合があります。データを挿入する際、ClickHouse は上の表に従ってデータ型を解釈し、その後、データを ClickHouse table のカラムに設定されたデータ型にキャストします。たとえば、UINT_32 の Parquet カラムは IPv4 の ClickHouse カラムに読み込むことができます。 一部の Parquet 型には、厳密に対応する ClickHouse 型がありません。これらは次のように読み取られます。
  • TIME (時刻) は timestamp として読み取られます。例: 10:23:13.0001970-01-01 10:23:13.000 になります。
  • isAdjustedToUTC=falseTIMESTAMP/TIME はローカルの wall-clock time (どの time zone がローカルと見なされるかにかかわらず、ローカル timezone における年、月、日、時、分、秒、および秒未満の各フィールドを持つ時刻) で、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 ではなく何らかのローカル timezone の値として解釈できます。直感に反しますが、型を DateTime64(3, 'UTC') から DateTime64(3) に変更しても改善しません。どちらの型も時計の表示ではなく時点を表すためです。ただし、DateTime64(3) はローカル timezone を使って誤ってフォーマットされます。
  • INTERVAL は現在、Parquet file でエンコードされた時間間隔の生のバイナリ表現を持つ FixedString(12) として読み取られます。

Geo types (GeoParquet)

ClickHouse は、GeoParquet 仕様に準拠した ジオメトリカラム の読み書きをサポートしています。ジオメトリカラム は、WKB (読み取り時は WKT) でエンコードされた BYTE_ARRAY ペイロードとして保存され、ファイルレベルの Parquet メタデータには、各 ジオメトリカラム のエンコーディング、ジオメトリ型、CRS を記述する JSON の geo キーが含まれます。

読み取り時の挙動

読み取り時には、ジオメトリカラム は対応する ClickHouse のGeo data typesにマッピングされます。
  • PointLineStringPolygonMultiLineString、または MultiPolygon として宣言されたカラムは、対応する ClickHouse の Geo 型として読み取られます。
  • 複数の geometry types を持つカラム、または geometry type が不明なカラムは、サポートされているすべての Geo 型に対する Variant である Geometry 型として読み取られます。
  • 要求されたカラム型が String の場合、GeoParquet のメタデータは無視され、エンコード済みの生のジオメトリ payload がそのまま返されます。返されるのは、GeoParquet カラムで宣言されているエンコードに応じた WKB または WKT のバイト列です。これは、設定 input_format_parquet_allow_geoparquet_parser0 に設定されている場合も同様です。

書き込み動作

書き込み時には、型が PointLineStringPolygonMultiLineString、または MultiPolygon のトップレベルのカラムは BYTE_ARRAY (WKB) としてエンコードされ、適切な geo JSON メタデータが Parquet ファイルのフッターに追加されます。トップレベルの Geometry Variant も WKB の BYTE_ARRAY payload としてエンコードされます (その下位の値は WKB に変換され、Nullable(String) カラムとして保存されます) が、これについては geo メタデータが出力されないため、読み取り時に結果は GeoParquet の geometry カラムとして認識されません。Ring などのその他の geo 関連型は、GeoParquet メタデータを付与せず、ネイティブな内部表現のまま書き込まれます。この動作は output_format_parquet_geometadata0 に設定することで完全に無効化できます。この場合、サポートされている geo 型であってもネイティブな内部表現 (PointTuple(Float64, Float64)LineStringArray(Point)PolygonArray(Array(Point)) など) を使って書き込まれ、GeoParquet メタデータも出力されません。 Geometry カラムはスキーマのルートに置くか、Tuple (struct) の内側にネストする必要があります。ArrayMap の内側にネストすることはサポートされていません。また、geo カラムに対する Nullable もサポートされていません。

使用例

データの挿入

football.parquet という名前の、次のデータを含む Parquet ファイルを使用します。
データを挿入します:

データの読み取り

Parquetフォーマットを使用してデータを読み取ります。
Parquet はバイナリフォーマットのため、端末上で人が読める形式では表示されません。Parquet ファイルを出力するには、INTO OUTFILE を使用します。
Hadoop とデータをやり取りするには、HDFS テーブルエンジン を使用できます。

フォーマット設定

最終更新日 2026年7月23日