ClickHouseでのCSVおよびTSVデータの操作
ClickHouseは、CSVからのデータのインポートとCSVへのデータのエクスポートをサポートしています。CSVファイルは、ヘッダー行、カスタム区切り文字、エスケープ記号など、さまざまな形式の特性を持つことがあるため、ClickHouseは各ケースに効率的に対応するための形式と設定を提供します。
CSVファイルからのデータのインポート
データをインポートする前に、関連する構造を持つテーブルを作成しましょう:
CSVファイルからsometable
テーブルにデータをインポートするには、ファイルを直接clickhouse-clientにパイプできます:
FORMAT CSVを使用していることに注意してください。これによりClickHouseは私たちがCSV形式のデータを取り込んでいることを認識します。あるいは、FROM INFILE句を使用してローカルファイルからデータを読み込むこともできます。
ここでは、FORMAT CSV
句を使用してClickHouseにファイル形式を理解させています。また、url()関数を使用してURLから直接データを読み込んだり、s3()関数を使ってS3ファイルからデータを読み込んだりすることもできます。
file()
およびINFILE
/OUTFILE
のための明示的なフォーマット設定はスキップできます。この場合、ClickHouseはファイル拡張子に基づいて自動的にフォーマットを検出します。
ヘッダー付きCSVファイル
私たちのCSVファイルにはヘッダーが含まれているとしましょう:
このファイルからデータをインポートするために、CSVWithNames形式を使用することができます:
この場合、ClickHouseはファイルからデータをインポートする際に最初の行をスキップします。
バージョン 23.1以降、ClickHouseはCSV
形式を使用してCSVファイルのヘッダーを自動的に検出するため、CSVWithNames
またはCSVWithNamesAndTypes
を使用する必要はありません。
カスタム区切り文字付きCSVファイル
CSVファイルがカンマ以外の区切り文字を使用している場合、format_csv_delimiterオプションを使用して関連する記号を設定できます:
これで、CSVファイルからインポートする際には、カンマ
の代わりに;
記号が区切り文字として使用されます。
CSVファイルの行をスキップする
ときどき、CSVファイルからデータをインポートする際に特定の行数をスキップしたい場合があります。これは、input_format_csv_skip_first_linesオプションを使用して行うことができます:
この場合、CSVファイルから最初の10行をスキップします:
ファイルには1k行がありますが、最初の10行をスキップするように要求したため、ClickHouseは990行しか読み込みませんでした。
file()
関数を使用する場合、ClickHouse Cloudではファイルが存在するマシン上でclickhouse client
のコマンドを実行する必要があります。別のオプションは、clickhouse-local
を使用して、ローカルでファイルを探索することです。
CSVファイル内のNULL値の扱い
NULL値のエンコードは、ファイルを生成したアプリケーションによって異なる場合があります。デフォルトでは、ClickHouseはCSV内のNULL値として\N
を使用します。ただし、format_csv_null_representationオプションを使用してこれを変更できます。
次のCSVファイルがあるとしましょう:
このファイルからデータを読み込むと、ClickHouseはNothing
をStringとして扱います(これは正しい動作です):
ClickHouseにNothing
をNULL
として扱わせたい場合、次のオプションを使用して定義できます:
これで、期待した場所にNULL
があります:
TSV(タブ区切り)ファイル
タブ区切りデータ形式は、データのやりとりフォーマットとして広く使用されています。TSVファイルからClickHouseにデータをロードするには、TabSeparated形式を使用します:
ヘッダーのあるTSVファイルを扱うためのTabSeparatedWithNames形式もあります。また、CSVと同様に、input_format_tsv_skip_first_linesオプションを使用して最初のX行をスキップすることもできます。
生のTSV
時々、TSVファイルはタブや改行をエスケープせずに保存されます。このようなファイルを処理するにはTabSeparatedRawを使用します。
CSVへのエクスポート
前の例に出てきた任意の形式を使用してデータをエクスポートすることもできます。テーブル(またはクエリ)からCSV形式にデータをエクスポートするには、同じFORMAT
句を使用します:
CSVファイルにヘッダーを追加するには、CSVWithNames形式を使用します:
エクスポートされたデータをCSVファイルに保存する
エクスポートされたデータをファイルに保存するには、INTO...OUTFILE句を使用できます:
36m行をCSVファイルに保存するのにClickHouseは約1秒かかったことに注意してください。
カスタム区切り文字付きCSVのエクスポート
カンマ以外の区切り文字を使用したい場合、format_csv_delimiter設定オプションを利用できます:
これで、ClickHouseはCSV形式の区切り文字として|
を使用します:
Windows向けのCSVのエクスポート
CSVファイルがWindows環境で正しく動作するようにするには、output_format_csv_crlf_end_of_lineオプションを有効にすることを検討してください。これにより、行の区切りを\n
の代わりに\r\n
として使用します:
CSVファイルのスキーマ推論
未知のCSVファイルを扱うことが多いため、カラム用の型を調査する必要があります。ClickHouseは、デフォルトで、与えられたCSVファイルの分析に基づいてデータ形式を推測しようとします。これは「スキーマ推論」として知られています。検出されたデータ型は、DESCRIBE
ステートメントとファイル()関数を組み合わせて調査できます:
ここで、ClickHouseは私たちのCSVファイルに対するカラム型を効率的に推測しました。ClickHouseに推測させたくない場合、次のオプションを使用して無効にできます:
この場合、すべてのカラム型はString
として扱われます。
明示的なカラム型でのCSVのエクスポートとインポート
ClickHouseは、データをエクスポートする際にCSVWithNamesAndTypes(およびその他の*WithNames形式ファミリー)で明示的にカラム型を設定することも許可しています:
この形式には、カラム名とカラム型の2行のヘッダーが含まれます。これにより、ClickHouse(および他のアプリ)がこのようなファイルからデータをロードする際にカラム型を識別できるようになります:
これで、ClickHouseは推測するのではなく、(2行目の)ヘッダー行に基づいてカラム型を識別します。
カスタム区切り文字、セパレーター、およびエスケープルール
複雑なケースでは、テキストデータが非常にカスタムな形式でフォーマットされることがありますが、依然として構造を持っています。ClickHouseには、そのような場合のために特別なCustomSeparated形式があり、カスタムのエスケープルール、区切り文字、行セパレーター、および開始/終了記号を設定できます。
ファイル内に以下のデータがあると仮定しましょう:
各行はrow()
でラップされ、行は,
で区切られ、個々の値は;
で区切られています。この場合、次の設定を使用してこのファイルからデータを読み込むことができます:
これで、私たちのカスタムフォーマットのファイルからデータをロードできます:
CustomSeparatedWithNamesを使用してヘッダーを正しくエクスポートおよびインポートすることもできます。より複雑なケースに対処するためにregexとテンプレート形式を探索してください。
大きなCSVファイルの扱い
CSVファイルは大きくなる可能性があり、ClickHouseは任意のサイズのファイルで効率的に動作します。大きなファイルは通常圧縮されており、ClickHouseは処理の前に展開することなくこれをカバーしています。挿入時にCOMPRESSION
句を使用できます:
COMPRESSION
句が省略された場合でも、ClickHouseはファイルの拡張子に基づいてファイル圧縮を推測しようとします。すべてのファイルを直接圧縮形式にエクスポートするための同じアプローチを使用できます:
これにより、圧縮されたdata_csv.csv.gz
ファイルが作成されます。
その他の形式
ClickHouseは、さまざまなシナリオやプラットフォームをカバーするために、多くの形式(テキスト形式およびバイナリ形式)をサポートしています。次の記事で、より多くの形式やそれらとの作業方法を探索してください:
- CSVおよびTSV形式
- Parquet
- JSON形式
- Regexおよびテンプレート
- ネイティブおよびバイナリ形式
- SQL形式
また、clickhouse-localを確認してください - Clickhouseサーバーなしでローカル/リモートファイルで作業するためのポータブルでフル機能のツールです。