Parquetは、列指向の方法でデータを保存するための効率的なファイル形式です。
ClickHouseは、Parquetファイルの読み書きをサポートしています。
ヒント
クエリでファイルパスを参照する際、ClickHouseが読み込もうとする場所は、使用しているClickHouseのバリアントによって異なります。
clickhouse-local
を使用している場合は、ClickHouse Localを起動した場所に対して相対的な位置から読み込むことになります。
ClickHouse Serverまたはclickhouse client
を介してClickHouse Cloudを使用している場合は、サーバー上の/var/lib/clickhouse/user_files/
ディレクトリに対して相対的な位置から読み込みます。
Parquetからのインポート
データをロードする前に、file()関数を使用して、例のparquetファイルの構造を調べることができます:
DESCRIBE TABLE file('data.parquet', Parquet);
2番目の引数としてParquetを使用しているため、ClickHouseはファイル形式を認識します。これにより、カラムの型が表示されます:
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
実際にデータをインポートする前に、SQLの力を利用してファイルを調べることもできます:
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;
┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘
ヒント
file()
およびINFILE
/OUTFILE
に対して明示的な形式設定をスキップすることができます。
その場合、ClickHouseはファイル拡張子に基づいて形式を自動的に検出します。
既存のテーブルへのインポート
Parquetデータをインポートするために、テーブルを作成しましょう:
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);
次に、FROM INFILE
句を使用してデータをインポートできます:
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;
┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘
ClickHouseがParquetの文字列(date
カラム内)をDate
型に自動的に変換したことに注意してください。これは、ClickHouseがターゲットテーブルの型に基づいて自動的に型キャストを行うからです。
ローカルファイルをリモートサーバーに挿入する
ローカルのParquetファイルをリモートClickHouseサーバーに挿入したい場合、以下のようにファイルの内容をclickhouse-client
にパイプして行うことができます:
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet
Parquetファイルから新しいテーブルを作成する
ClickHouseはparquetファイルのスキーマを読み取るため、テーブルを即座に作成することができます:
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)
これにより、指定されたparquetファイルからテーブルが自動的に作成され、データが挿入されます:
DESCRIBE TABLE imported_from_parquet;
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
デフォルトでは、ClickHouseはカラム名、型、値に対して厳格です。しかし、時にはインポート中に存在しないカラムやサポートされていない値をスキップすることができます。これについてはParquet設定で管理できます。
ヒント
ClickHouse Cloudを使用してINTO OUTFILE
を使用する場合、ファイルが書き込まれるマシン上でclickhouse client
でコマンドを実行する必要があります。
任意のテーブルまたはクエリ結果をParquetファイルにエクスポートするために、INTO OUTFILE
句を使用できます:
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquet
これにより、作業ディレクトリにexport.parquet
ファイルが作成されます。
ClickHouseとParquetデータ型
ClickHouseとParquetのデータ型はほぼ同一ですが、わずかに異なります。例えば、ClickHouseはDateTime
型をParquetのint64
としてエクスポートします。その後、それをClickHouseにインポートすると、数値が表示されます(time.parquetファイル):
SELECT * FROM file('time.parquet', Parquet);
┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘
この場合、型変換を使用できます:
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);
┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘
その他の参考情報
ClickHouseは、さまざまなシナリオやプラットフォームをカバーするために、多くの形式(テキストとバイナリの両方)をサポートしています。次の記事で、さらに多くの形式やそれらとの操作方法を探ってください:
また、clickhouse-localもチェックしてください。これは、Clickhouseサーバーを必要とせずにローカル/リモートファイルで作業できる、ポータブルなフル機能ツールです。