18 KiB
sidebar_label | slug |
---|---|
CSV と TSV | /ja/integrations/data-formats/csv-tsv |
ClickHouseでのCSVとTSVデータの操作
ClickHouseは、CSVからのデータのインポートおよびエクスポートをサポートしています。CSVファイルはヘッダ行、カスタムデリミタ、エスケープシンボルなど、さまざまなフォーマット仕様を持つ場合があります。そのため、ClickHouseは各ケースに効率的に対応するためのフォーマットと設定を提供しています。
CSVファイルからのデータのインポート
データをインポートする前に、次のような関連する構造のテーブルを作成します:
CREATE TABLE sometable
(
`path` String,
`month` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY tuple(month, path)
このCSVファイルからsometable
テーブルにデータをインポートするには、ファイルを直接clickhouse-clientにパイプします:
clickhouse-client -q "INSERT INTO sometable FORMAT CSV" < data_small.csv
FORMAT CSVを使用して、CSVフォーマットのデータを取り込むことをClickHouseに知らせます。別の方法として、ローカルファイルからデータをロードする場合は、FROM INFILE句を使用します:
INSERT INTO sometable
FROM INFILE 'data_small.csv'
FORMAT CSV
ここでは、FORMAT CSV
句を使用して、ClickHouseがファイルフォーマットを理解できるようにしています。URLから直接データをロードするにはurl()関数や、S3ファイルからはs3()関数を使用できます。
:::tip
file()
およびINFILE
/OUTFILE
に対して明示的なフォーマット設定をスキップできます。
その場合、ClickHouseはファイルの拡張子に基づいてフォーマットを自動的に検出します。
:::
ヘッダ付きのCSVファイル
ヘッダ付きのCSVファイルがあると仮定します:
head data-small-headers.csv
"path","month","hits"
"Akiba_Hebrew_Academy","2017-08-01",241
"Aegithina_tiphia","2018-02-01",34
このファイルからデータをインポートするには、CSVWithNamesフォーマットを使用します:
clickhouse-client -q "INSERT INTO sometable FORMAT CSVWithNames" < data_small_headers.csv
この場合、ClickHouseはファイルの最初の行をスキップしてデータをインポートします。
:::tip
23.1バージョン以降では、CSV
タイプを使用した場合にClickHouseがCSVファイルのヘッダを自動的に検出するようになるので、CSVWithNames
やCSVWithNamesAndTypes
を使用する必要がありません。
:::
カスタムデリミタ付きのCSVファイル
CSVファイルがカンマ以外のデリミタを使用する場合は、format_csv_delimiterオプションを使用して関連するシンボルを設定できます:
SET format_csv_delimiter = ';'
これで、CSVファイルからのインポート時にカンマの代わりに;
シンボルがデリミタとして使用されます。
CSVファイルの行のスキップ
時には、CSVファイルからのデータインポート時に特定の行数をスキップすることがあります。これはinput_format_csv_skip_first_linesオプションを使用して行うことができます:
SET input_format_csv_skip_first_lines = 10
この場合、CSVファイルの最初の10行をスキップします:
SELECT count(*) FROM file('data-small.csv', CSV)
┌─count()─┐
│ 990 │
└─────────┘
ファイルには1k行がありますが、最初の10行をスキップするように指示したため、ClickHouseは990行のみをロードしました。
:::tip
file()
関数を使用する場合、ClickHouse Cloudでは、ファイルが存在するマシン上でclickhouse client
を実行する必要があります。ローカルでファイルを探索するにはclickhouse-local
を使用することもできます。
:::
CSVファイルでのNULL値の扱い
NULL値は、ファイルを生成したアプリケーションに応じて異なる方法でエンコードされることがあります。デフォルトでは、ClickHouseはCSVで\N
をNULL値として使用しますが、format_csv_null_representationオプションを使用して変更できます。
次のCSVファイルがあるとします:
> cat nulls.csv
Donald,90
Joe,Nothing
Nothing,70
このファイルからデータをロードすると、ClickHouseはNothing
を文字列として扱います(これが正しい):
SELECT * FROM file('nulls.csv')
┌─c1──────┬─c2──────┐
│ Donald │ 90 │
│ Joe │ Nothing │
│ Nothing │ 70 │
└─────────┴─────────┘
ClickHouseにNothing
をNULL
として扱わせたい場合は、次のオプションを使用して定義できます:
SET format_csv_null_representation = 'Nothing'
これで、期待通りにNULL
が入ります:
SELECT * FROM file('nulls.csv')
┌─c1─────┬─c2───┐
│ Donald │ 90 │
│ Joe │ ᴺᵁᴸᴸ │
│ ᴺᵁᴸᴸ │ 70 │
└────────┴──────┘
TSV(タブ区切り)ファイル
タブ区切りデータフォーマットは、データ交換フォーマットとして広く使用されているフォーマットです。TSVファイルからClickHouseにデータをロードするには、TabSeparatedフォーマットを使用します:
clickhouse-client -q "INSERT INTO sometable FORMAT TabSeparated" < data_small.tsv
ヘッダを持つTSVファイルを操作するためのTabSeparatedWithNamesフォーマットもあります。また、CSVと同様に、input_format_tsv_skip_first_linesオプションを使用して最初のX行をスキップすることもできます。
Raw TSV
時折、TSVファイルはタブや改行をエスケープせずに保存されることがあります。そのようなファイルを扱うためには、TabSeparatedRawを使用するべきです。
CSVへのエクスポート
前の例のいずれかのフォーマットは、データをエクスポートするためにも使用できます。テーブル(またはクエリ)からCSVフォーマットにデータをエクスポートするには、同じFORMAT
句を使用します:
SELECT *
FROM sometable
LIMIT 5
FORMAT CSV
"Akiba_Hebrew_Academy","2017-08-01",241
"Aegithina_tiphia","2018-02-01",34
"1971-72_Utah_Stars_season","2016-10-01",1
"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73
"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86
CSVファイルにヘッダを追加するには、CSVWithNamesフォーマットを使用します:
SELECT *
FROM sometable
LIMIT 5
FORMAT CSVWithNames
"path","month","hits"
"Akiba_Hebrew_Academy","2017-08-01",241
"Aegithina_tiphia","2018-02-01",34
"1971-72_Utah_Stars_season","2016-10-01",1
"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73
"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86
エクスポートしたデータをCSVファイルに保存
エクスポートしたデータをファイルに保存するには、INTO…OUTFILE句を使用します:
SELECT *
FROM sometable
INTO OUTFILE 'out.csv'
FORMAT CSVWithNames
36838935 rows in set. Elapsed: 1.304 sec. Processed 36.84 million rows, 1.42 GB (28.24 million rows/s., 1.09 GB/s.)
36百万行をCSVファイルに保存するのにClickHouseが約1秒かかりました。
カスタムデリミタでのCSVエクスポート
カンマ以外のデリミタを使用したい場合は、format_csv_delimiter設定オプションを使用できます:
SET format_csv_delimiter = '|'
これで、ClickHouseはCSVフォーマットで|
をデリミタとして使用します:
SELECT *
FROM sometable
LIMIT 5
FORMAT CSV
"Akiba_Hebrew_Academy"|"2017-08-01"|241
"Aegithina_tiphia"|"2018-02-01"|34
"1971-72_Utah_Stars_season"|"2016-10-01"|1
"2015_UEFA_European_Under-21_Championship_qualification_Group_8"|"2015-12-01"|73
"2016_Greater_Western_Sydney_Giants_season"|"2017-05-01"|86
Windows向けのCSVエクスポート
Windows環境で問題なく動作するCSVファイルが必要な場合は、output_format_csv_crlf_end_of_lineオプションを有効にすることを検討すべきです。これにより、改行として\n
の代わりに\r\n
が使用されます:
SET output_format_csv_crlf_end_of_line = 1;
CSVファイルのスキーマ推論
多くの場合、不明なCSVファイルを操作しなければならないため、カラムにどのデータ型を使用するかを探索する必要があります。ClickHouseはデフォルトで、指定されたCSVファイルの分析に基づいてデータ型を推測しようとします。これは「スキーマ推論」として知られています。検出されたデータ型は、file()関数と組み合わせてDESCRIBE
ステートメントを使用して探索できます:
DESCRIBE file('data-small.csv', CSV)
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ c1 │ Nullable(String) │ │ │ │ │ │
│ c2 │ Nullable(Date) │ │ │ │ │ │
│ c3 │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
ここで、ClickHouseは効率的にCSVファイルのカラム型を推測できました。ClickHouseに推測させたくない場合は、次のオプションを使用して無効にできます:
SET input_format_csv_use_best_effort_in_schema_inference = 0
すべてのカラムタイプは、この場合String
として扱われます。
カラムタイプを明示的に指定したCSVのエクスポートとインポート
ClickHouseは、CSVWithNamesAndTypes(および他の*WithNamesフォーマットファミリー)を使用してデータをエクスポートする際にカラムタイプを明示的に設定することもできます:
SELECT *
FROM sometable
LIMIT 5
FORMAT CSVWithNamesAndTypes
"path","month","hits"
"String","Date","UInt32"
"Akiba_Hebrew_Academy","2017-08-01",241
"Aegithina_tiphia","2018-02-01",34
"1971-72_Utah_Stars_season","2016-10-01",1
"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73
"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86
このフォーマットでは、カラム名を持つ1行とカラム型を持つもう1行の2つのヘッダ行が含まれます。これにより、ClickHouse(および他のアプリ)はそのようなファイルからデータをロードする際にカラムタイプを識別できます:
DESCRIBE file('data_csv_types.csv', CSVWithNamesAndTypes)
┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ String │ │ │ │ │ │
│ month │ Date │ │ │ │ │ │
│ hits │ UInt32 │ │ │ │ │ │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
これで、ClickHouseは推測の代わりに、(2番目の)ヘッダ行に基づいてカラム型を識別します。
カスタムデリミタ、セパレータ、およびエスケープルール
複雑なケースでは、テキストデータは非常にカスタムな形式でフォーマットされ、それでも構造を持つことがあります。このようなケースには、カスタムエスケープルール、デリミタ、行セパレータ、開始/終了シンボルを設定できる特別なCustomSeparatedフォーマットがあります。
次のデータがファイルにあると仮定します:
row('Akiba_Hebrew_Academy';'2017-08-01';241),row('Aegithina_tiphia';'2018-02-01';34),...
個別の行がrow()
で囲まれ、行は,
で分離され、個別の値は;
で区切られていることがわかります。この場合、次の設定を使用してこのファイルからデータを読み込むことができます:
SET format_custom_row_before_delimiter = 'row(';
SET format_custom_row_after_delimiter = ')';
SET format_custom_field_delimiter = ';';
SET format_custom_row_between_delimiter = ',';
SET format_custom_escaping_rule = 'Quoted';
これで、カスタムフォーマットファイルからデータをロードできます:
SELECT *
FROM file('data_small_custom.txt', CustomSeparated)
LIMIT 3
┌─c1────────────────────────┬─────────c2─┬──c3─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴─────┘
CustomSeparatedWithNamesを使用して、ヘッダを正しくエクスポートおよびインポートすることもできます。さらに複雑なケースに対処するために、正規表現やテンプレートフォーマットについてはregexとテンプレートを探ってください。
大容量CSVファイルの操作
CSVファイルは大容量になることがあり、ClickHouseはどのようなサイズのファイルでも効率的に操作します。大容量のファイルは通常圧縮されており、ClickHouseは処理前に解凍する必要はありません。Insert中にCOMPRESSION
句を使用できます:
INSERT INTO sometable
FROM INFILE 'data_csv.csv.gz'
COMPRESSION 'gzip' FORMAT CSV
COMPRESSION
句を省略した場合、ClickHouseはファイルの拡張子に基づいて圧縮形式を推測しようとします。同じアプローチを使用して、ファイルを直接圧縮フォーマットにエクスポートすることもできます:
SELECT *
FROM for_csv
INTO OUTFILE 'data_csv.csv.gz'
COMPRESSION 'gzip' FORMAT CSV
これにより、圧縮されたdata_csv.csv.gz
ファイルが作成されます。
その他のフォーマット
ClickHouseは、さまざまなシナリオやプラットフォームをカバーするために、多くのフォーマット、テキストおよびバイナリー形式のサポートを導入しています。次の記事で、これらのフォーマットおよびそれらを使用する方法についてさらに探ってください:
- CSVとTSVフォーマット
- Parquet
- JSONフォーマット
- 正規表現とテンプレート
- ネイティブおよびバイナリーフォーマット
- SQLフォーマット
また、ローカル/リモートファイルでClickhouseサーバーを必要とせずに作業を行うための携帯型完全集合ツールであるclickhouse-localもチェックしてください。