メインコンテンツまでスキップ
メインコンテンツまでスキップ

入力データからの自動スキーマ推論

ClickHouseは、ほぼすべてのサポートされている 入力フォーマット から、入力データの構造を自動的に判断できます。この文書では、スキーマ推論が使用される場面、異なる入力フォーマットでの動作、そしてそれを制御できる設定について説明します。

使用法

スキーマ推論は、ClickHouseが特定のデータフォーマットでデータを読み取る必要があり、その構造が不明な場合に使用されます。

テーブル関数 file, s3, url, hdfs, azureBlobStorage

これらのテーブル関数には、入力データの構造を指定するオプション引数 structure があります。この引数が指定されていないか、auto に設定されている場合、構造はデータから推論されます。

例:

user_files ディレクトリに次の内容の hobbies.jsonl というJSONEachRow形式のファイルがあるとします:

ClickHouseは、このデータをその構造を指定せずに読み取ることができます:

注意: フォーマット JSONEachRow は、ファイル拡張子 .jsonl によって自動的に判断されました。

次の DESCRIBE クエリを使用すると、自動的に判断された構造を確認できます:

テーブルエンジン File, S3, URL, HDFS, azureBlobStorage

CREATE TABLE クエリでカラムのリストが指定されていない場合、テーブルの構造はデータから自動的に推論されます。

例:

hobbies.jsonl ファイルを使って、エンジン File を使ったテーブルを作成することができます:

clickhouse-local

clickhouse-local には、入力データの構造を指定するオプションパラメーター -S/--structure があります。このパラメーターが指定されていないか、auto に設定されている場合、構造はデータから推論されます。

例:

hobbies.jsonl ファイルを使用しましょう。このファイルからデータをクエリできる clickhouse-local を使います:

挿入テーブルからの構造の使用

テーブル関数 file/s3/url/hdfs を使ってデータをテーブルに挿入する際、データから抽出する代わりに挿入テーブルから構造を使用するオプションがあります。これは、スキーマ推論に時間がかかる可能性があるため、挿入パフォーマンスを向上させることができます。また、テーブルが最適化されたスキーマを持つ場合、型間の変換が行われないので有用です。

この動作を制御する特別な設定 use_structure_from_insertion_table_in_table_functions があります。可能な値は次のとおりです:

  • 0 - テーブル関数はデータから構造を抽出します。
  • 1 - テーブル関数は挿入テーブルから構造を使用します。
  • 2 - ClickHouseが挿入テーブルから構造を使用するか、スキーマ推論を使用するかを自動的に判断します(デフォルト値)。

例 1:

次の構造でテーブル hobbies1 を作成します:

次に、ファイル hobbies.jsonl からデータを挿入します:

この場合、ファイルのすべてのカラムが変更なしでテーブルに挿入されるため、ClickHouseはスキーマ推論ではなく挿入テーブルから構造を使用します。

例 2:

次の構造でテーブル hobbies2 を作成します:

次に、ファイル hobbies.jsonl からデータを挿入します:

この場合、SELECT クエリのすべてのカラムがテーブルに存在するため、ClickHouseは挿入テーブルから構造を使用します。これは、JSONEachRow、TSKV、Parquet などの、カラムのサブセットを読み取ることをサポートする入力フォーマットでのみ機能します(例えば、TSVフォーマットでは機能しません)。

例 3:

次の構造でテーブル hobbies3 を作成します:

次に、ファイル hobbies.jsonl からデータを挿入します:

この場合、SELECT クエリで id カラムが使用されますが、テーブルにはこのカラムがありません(identifier という名前のカラムがあります)。したがって、ClickHouseは挿入テーブルから構造を使用できず、スキーマ推論が使用されます。

例 4:

次の構造でテーブル hobbies4 を作成します:

次に、ファイル hobbies.jsonl からデータを挿入します:

この場合、挿入テーブルに入れるための SELECT クエリでカラム hobbies に対していくつかの操作が行われるため、ClickHouseは挿入テーブルから構造を使用できず、スキーマ推論が使用されます。

スキーマ推論キャッシュ

ほとんどの入力フォーマットでは、スキーマ推論がデータを読み取ってその構造を判断するためにいくつかのデータを読み取ります。このプロセスは時間がかかる場合があります。同じファイルからデータを再度読み取る際に毎回同じスキーマを推論することを防ぐために、推論されたスキーマはキャッシュされ、同じファイルに再アクセスする際にはキャッシュからスキーマが使用されます。

このキャッシュを制御する特別な設定があります:

  • schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure} - 対応するテーブル関数用のキャッシュされたスキーマの最大数。デフォルト値は 4096 です。これらの設定は、サーバー構成に設定する必要があります。
  • schema_inference_use_cache_for_{file,s3,hdfs,url,azure} - スキーマ推論にキャッシュを使用するかどうかをオン/オフします。これらの設定は、クエリ内で使用できます。

ファイルのスキーマは、データを変更したり、フォーマット設定を変更したりすることで変更できます。このため、スキーマ推論キャッシュは、ファイルソース、フォーマット名、使用されたフォーマット設定、ファイルの最終変更時刻によってスキーマを特定します。

注意: url テーブル関数でアクセスされる一部のファイルには、最終変更時刻の情報が含まれていない場合があります。この場合、特別な設定 schema_inference_cache_require_modification_time_for_url があります。この設定を無効にすると、そのようなファイルに対して最終変更時刻なしでキャッシュからスキーマを使用できます。

また、キャッシュ内のすべての現在のスキーマを含むシステムテーブル schema_inference_cache があり、SYSTEM DROP SCHEMA CACHE [FOR File/S3/URL/HDFS] というシステムクエリが、すべてのソースまたは特定のソースのスキーマキャッシュをクリアすることを可能にします。

例:

s3 のサンプルデータセット github-2022.ndjson.gz の構造を推論して、スキーマ推論キャッシュがどのように機能するかを見てみましょう:

ご覧のように、2回目のクエリはほぼ瞬時に成功しました。

推論されたスキーマに影響を与える可能性のある設定のいくつかを変更してみましょう:

ご覧のように、同じファイルに対してはキャッシュのスキーマが使用されなかったため、推論されたスキーマが変更されました。

system.schema_inference_cache テーブルの内容を確認してみましょう:

同じファイルに対して2つの異なるスキーマがあります。

システムクエリを使ってスキーマキャッシュをクリアできます:

テキストフォーマット

テキストフォーマットでは、ClickHouseはデータを行ごとに読み取り、フォーマットに応じてカラム値を抽出し、次にいくつかの再帰的なパーサーとヒューリスティックを使用して各値の型を決定します。スキーマ推論において読み取る最大行数とバイト数は、設定 input_format_max_rows_to_read_for_schema_inference (デフォルトは25000)と input_format_max_bytes_to_read_for_schema_inference (デフォルトは32Mb)によって制御されます。デフォルトでは、すべて推論された型は Nullable ですが、これを schema_inference_make_columns_nullable の設定によって変更できます(設定 セクションの例を参照してください)。

JSONフォーマット

JSONフォーマットでは、ClickHouseはJSON仕様に従って値をパースし、それから最も適切なデータ型を見つけようとします。

それがどのように機能するか、どの型が推論できるか、そしてJSONフォーマットで使用できる特定の設定を見てみましょう。

ここでの例には、format テーブル関数が使用されます。

整数、浮動小数点数、ブール値、文字列:

日付、日付時間:

配列:

配列に null が含まれている場合、ClickHouseは他の配列要素の型を使用します:

名前付きタプル:

input_format_json_try_infer_named_tuples_from_objects の設定が有効な場合、スキーマ推論中にClickHouseはJSONオブジェクトから名前付きタプルを推論しようとします。結果の名前付きタプルは、サンプルデータのすべての対応するJSONオブジェクトのすべての要素を含みます。

名前のないタプル:

JSONフォーマットでは、異なる型の要素を持つ配列を名前のないタプルとして扱います。

もし値が null または空である場合、他の行からの対応する値の型を使用します:

地図:

JSONでは、同じ型の値を持つオブジェクトをマップ型として読み取ることができます。 注意: input_format_json_read_objects_as_stringsinput_format_json_try_infer_named_tuples_from_objects の設定が無効な場合のみ機能します。

JSONオブジェクト型 (設定 allow_experimental_object_type が有効な場合):

ネストされた複雑な型:

ClickHouseが一部のキーの型を決定できない場合(データが null のみ、空のオブジェクト、空の配列を含むため)、input_format_json_infer_incomplete_types_as_strings の設定が有効な場合は型 String が使用され、それ以外の場合は例外がスローされます:

JSON設定

input_format_json_try_infer_numbers_from_strings

この設定を有効にすると、文字列値から数値を推論することができます。

この設定はデフォルトで無効です。

例:

input_format_json_try_infer_named_tuples_from_objects

この設定を有効にすると、JSONオブジェクトから名前付きタプルを推論することができます。結果の名前付きタプルは、サンプルデータのすべての対応するJSONオブジェクトのすべての要素を含みます。これはJSONデータがスパースでない場合に有用で、データのサンプルにはすべての可能なオブジェクトキーが含まれます。

この設定はデフォルトで有効です。

結果:

結果:

input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects

この設定を有効にすると、JSONオブジェクトからの名前付きタプルの推論中に、あいまいなパスに対して文字列型を使用できます(input_format_json_try_infer_named_tuples_from_objectsが有効な場合)。これにより、あいまいなパスがあっても、JSONオブジェクトを名前付きタプルとして読み取ることができます。

デフォルトでは無効です。

設定が無効な場合:

結果:

設定が有効な場合:

結果:

input_format_json_read_objects_as_strings

この設定を有効にすると、ネストされたJSONオブジェクトを文字列として読み込むことができます。 この設定は、JSONオブジェクト型を使用せずにネストされたJSONオブジェクトを読み取るために使用できます。

この設定はデフォルトで有効です。

注: この設定を有効にしても、input_format_json_try_infer_named_tuples_from_objectsが無効である場合にのみ効果があります。

input_format_json_read_numbers_as_strings

この設定を有効にすると、数値を文字列として読み込むことができます。

この設定はデフォルトで有効です。

input_format_json_read_bools_as_numbers

この設定を有効にすると、Bool値を数値として読み込むことができます。

この設定はデフォルトで有効です。

例:

input_format_json_read_bools_as_strings

この設定を有効にすると、Bool値を文字列として読み込むことができます。

この設定はデフォルトで有効です。

例:

input_format_json_read_arrays_as_strings

この設定を有効にすると、JSON配列の値を文字列として読み込むことができます。

この設定はデフォルトで有効です。

input_format_json_infer_incomplete_types_as_strings

この設定を有効にすると、スキーマ推測中にデータサンプルにNull/{}/[]のみを含むJSONキーに対して文字列型を使用できます。 JSON形式では、すべての対応する設定が有効であれば(すべてデフォルトで有効)、任意の値は文字列として読み取ることができ、スキーマ推測中にCannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Mapsのようなエラーを回避できます。

例:

結果:

CSV

CSV形式では、ClickHouseは区切り文字に従って行から列の値を抽出します。ClickHouseは数値や文字列を除くすべてのタイプを二重引用符で囲むことを期待します。値が二重引用符で囲まれている場合、ClickHouseは再帰解析器を使用して引用符内のデータを解析し、最も適切なデータ型を見つけようとします。値が二重引用符で囲まれていない場合、ClickHouseはそれを数値として解析し、値が数値でない場合、ClickHouseはそれを文字列として扱います。

ClickHouseが複雑なタイプをいくつかの解析器とヒューリスティックを使用して決定しないようにするには、設定 input_format_csv_use_best_effort_in_schema_inference を無効にすると、ClickHouseはすべての列を文字列として扱います。

設定 input_format_csv_detect_header が有効になっている場合、ClickHouseはスキーマ推測中に列名(おそらく型)のヘッダーを検出しようとします。この設定はデフォルトで有効です。

例:

整数、浮動小数点、ブール、文字列:

引用符なしの文字列:

日付、日付時刻:

配列:

配列にnullが含まれている場合、ClickHouseは他の配列要素の型を使用します:

マップ:

ネストされた配列とマップ:

ClickHouseが型を決定できない場合、データがnullのみを含む場合、ClickHouseはそれを文字列として扱います:

設定input_format_csv_use_best_effort_in_schema_inferenceを無効にした例:

ヘッダーの自動検出の例(input_format_csv_detect_headerが有効な場合):

名前のみ:

名前と型:

ヘッダーは少なくとも1つの非文字列型の列がある場合にのみ検出できることに注意してください。すべての列が文字列型の場合、ヘッダーは検出されません:

CSV設定

input_format_csv_try_infer_numbers_from_strings

この設定を有効にすると、文字列値から数値を推測できるようになります。

この設定はデフォルトで無効です。

例:

TSV/TSKV

TSV/TSKV形式では、ClickHouseはタブ区切りの区切り文字に従って行から列の値を抽出し、抽出された値を再帰解析器を使用して解析して最も適切な型を決定します。型が決定できない場合、ClickHouseはこの値を文字列として扱います。

ClickHouseが複雑なタイプをいくつかの解析器とヒューリスティックを使用して決定しないようにするには、設定 input_format_tsv_use_best_effort_in_schema_inference を無効にすると、ClickHouseはすべての列を文字列として扱います。

設定 input_format_tsv_detect_header が有効になっている場合、ClickHouseはスキーマ推測中に列名(おそらく型)のヘッダーを検出しようとします。この設定はデフォルトで有効です。

例:

整数、浮動小数点、ブール、文字列:

日付、日付時刻:

配列:

配列にnullが含まれている場合、ClickHouseは他の配列要素の型を使用します:

タプル:

マップ:

ネストされた配列、タプル、マップ:

ClickHouseが型を決定できない場合、データがnullのみを含む場合、ClickHouseはそれを文字列として扱います:

設定input_format_tsv_use_best_effort_in_schema_inferenceを無効にした例:

ヘッダーの自動検出の例(input_format_tsv_detect_headerが有効な場合):

名前のみ:

名前と型:

日付、日時:

配列:

配列に null が含まれている場合、ClickHouse は他の配列要素から型を使用します:

タプル:

マップ:

入れ子の配列、タプル、マップ:

ClickHouse が型を特定できない場合、データが null のみを含む場合など、例外がスローされます:

input_format_tsv_use_best_effort_in_schema_inference を無効にした例:

CustomSeparated

CustomSeparated フォーマットでは、ClickHouse は最初に指定された区切りに従って行からすべてのカラム値を抽出し、その後、エスケープルールに従って各値のデータ型を推測しようとします。

input_format_custom_detect_header 設定が有効になっている場合、ClickHouse はスキーマを推測する際にカラム名(およびおそらく型)のヘッダを検出しようとします。この設定はデフォルトで有効です。

ヘッダの自動検出の例(input_format_custom_detect_header が有効な場合):

Template

Template フォーマットでは、ClickHouse は最初に指定されたテンプレートに従って行からすべてのカラム値を抽出し、その後、各値のデータ型をそのエスケープルールに従って推測します。

ファイル resultset に次の内容があるとしましょう:

ファイル row_format に次の内容があります:

次のクエリを実行することができます:

Regexp

Template と同様に、Regexp フォーマットでは、ClickHouse は最初に指定された正規表現に従って行からすべてのカラム値を抽出し、その後、指定されたエスケープルールに従って各値のデータ型を推測します。

Settings for text formats

input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference

これらの設定は、スキーマ推測のために読み取るデータの量を制御します。 読み取られる行/バイトが多いほど、スキーマ推測に費やされる時間は長くなりますが、それにより型を正しく特定する可能性が高くなります(特にデータに多くの null が含まれる場合)。

デフォルトの値:

  • input_format_max_rows_to_read_for_schema_inference25000
  • input_format_max_bytes_to_read_for_schema_inference33554432(32 Mb)

column_names_for_schema_inference

明示的なカラム名がないフォーマットの場合にスキーマ推測で使用するカラム名のリスト。指定された名前は、デフォルトの c1,c2,c3,... の代わりに使用されます。フォーマット: column1,column2,column3,...

schema_inference_hints

自動的に決定された型の代わりにスキーマ推測で使用するカラム名と型のリスト。フォーマット: 'column_name1 column_type1, column_name2 column_type2, ...'。 この設定は、自动的に決定できなかったカラムの型を指定したり、スキーマを最適化したりするために使用できます。

schema_inference_make_columns_nullable

nullability 情報がないフォーマットのスキーマ推測において、推測された型を Nullable にする制御。 設定が有効な場合、推測されたすべての型は Nullable になります。無効な場合、推測された型は決して Nullable になりません。auto に設定された場合、推測された型は、スキーマ推測中に解析されたサンプルに NULL が含まれている場合またはファイルのメタデータにカラムの nullability に関する情報が含まれている場合にのみ Nullable になります。

デフォルトで有効です。

input_format_try_infer_integers

有効な場合、ClickHouse はテキストフォーマットのスキーマ推測において浮動小数点の代わりに整数を推測しようとします。 サンプルデータのカラム内のすべての数値が整数であれば、結果の型は Int64 になります。1 つ以上の数値が浮動小数点であれば、結果の型は Float64 になります。 サンプルデータが整数のみを含み、少なくとも 1 つの整数が正で Int64 をオーバーフローする場合、ClickHouse は UInt64 を推測します。

デフォルトで有効です。

input_format_try_infer_datetimes

有効な場合、ClickHouse はテキストフォーマットのスキーマ推測において文字列フィールドから DateTime または DateTime64 を推測しようとします。 もしサンプルデータのカラム内のすべてのフィールドが成功裏に日付時刻として解析された場合、結果の型は DateTime または DateTime64(9) になります(任意の日付時刻に小数部分があれば)。 少なくとも 1 つのフィールドが日付時刻として解析されなかった場合、結果の型は String になります。

デフォルトで有効です。

input_format_try_infer_dates

有効な場合、ClickHouse はテキストフォーマットのスキーマ推測において文字列フィールドから Date を推測しようとします。 もしサンプルデータのカラム内のすべてのフィールドが成功裏に日付として解析された場合、結果の型は Date になります。 少なくとも 1 つのフィールドが日付として解析されなかった場合、結果の型は String になります。

デフォルトで有効です。

input_format_try_infer_exponent_floats

有効な場合、ClickHouse はテキストフォーマットで指数形式の浮動小数点を推測しようとします(JSON での指数形式の数値は常に推測されます)。

デフォルトで無効です。

Self describing formats

自己記述フォーマットは、データ自体の中にスキーマに関する情報を含んでいます。これは、説明を含むヘッダや、バイナリ型ツリー、または何らかのテーブルを含むことができます。 ClickHouse は、ファイルからこれらのフォーマットでスキーマを自動的に推測するために、型に関する情報を含むデータの一部を読み取り、それを ClickHouse テーブルのスキーマに変換します。

Formats with -WithNamesAndTypes suffix

ClickHouse は、-WithNamesAndTypes 接尾辞のあるいくつかのテキストフォーマットをサポートしています。この接尾辞は、データが実際のデータの前にカラム名と型を含む2つの追加行を持っていることを意味します。 そのようなフォーマットのスキーマ推測中、ClickHouse は最初の 2 行を読み取り、カラム名と型を抽出します。

メタデータを含むJSONフォーマット

いくつかのJSON入力フォーマット (JSON, JSONCompact, JSONColumnsWithMetadata) は、カラム名とタイプを含むメタデータが含まれています。 ClickHouseは、このようなフォーマットのスキーマ推論の際にこのメタデータを読み取ります。

Avro

Avroフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。

Avroデータ型ClickHouseデータ型
booleanBool
intInt32
int (date) *Date32
longInt64
floatFloat32
doubleFloat64
bytes, stringString
fixedFixedString(N)
enumEnum
array(T)Array(T)
union(null, T), union(T, null)Nullable(T)
nullNullable(Nothing)
string (uuid) *UUID
binary (decimal) *Decimal(P, S)

* Avro logical types

他のAvroタイプはサポートされていません。

Parquet

Parquetフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。

Parquetデータ型ClickHouseデータ型
BOOLBool
UINT8UInt8
INT8Int8
UINT16UInt16
INT16Int16
UINT32UInt32
INT32Int32
UINT64UInt64
INT64Int64
FLOATFloat32
DOUBLEFloat64
DATEDate32
TIME (ms)DateTime
TIMESTAMP, TIME (us, ns)DateTime64
STRING, BINARYString
DECIMALDecimal
LISTArray
STRUCTTuple
MAPMap

他のParquetタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable の中にありますが、schema_inference_make_columns_nullable 設定を使用して変更できます。

Arrow

Arrowフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。

Arrowデータ型ClickHouseデータ型
BOOLBool
UINT8UInt8
INT8Int8
UINT16UInt16
INT16Int16
UINT32UInt32
INT32Int32
UINT64UInt64
INT64Int64
FLOAT, HALF_FLOATFloat32
DOUBLEFloat64
DATE32Date32
DATE64DateTime
TIMESTAMP, TIME32, TIME64DateTime64
STRING, BINARYString
DECIMAL128, DECIMAL256Decimal
LISTArray
STRUCTTuple
MAPMap

他のArrowタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable の中にありますが、schema_inference_make_columns_nullable 設定を使用して変更できます。

ORC

ORCフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。

ORCデータ型ClickHouseデータ型
BooleanBool
TinyintInt8
SmallintInt16
IntInt32
BigintInt64
FloatFloat32
DoubleFloat64
DateDate32
TimestampDateTime64
String, Char, Varchar,BINARYString
DecimalDecimal
ListArray
StructTuple
MapMap

他のORCタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable の中にありますが、schema_inference_make_columns_nullable 設定を使用して変更できます。

ネイティブ

ネイティブフォーマットはClickHouse内で使用され、データ内にスキーマが含まれています。 スキーマ推論の際、ClickHouseはデータからスキーマを読み取り、変換を行いません。

外部スキーマを持つフォーマット

そのようなフォーマットでは、特定のスキーマ言語でデータを記述するスキーマを別ファイルに必要とします。 そのようなフォーマットのファイルから自動的にスキーマを推論するために、ClickHouseは別のファイルから外部スキーマを読み取ってClickHouseテーブルスキーマに変換します。

Protobuf

Protobufフォーマットのスキーマ推論の際、ClickHouseは以下のタイプマッチを使用します。

Protobufデータ型ClickHouseデータ型
boolUInt8
floatFloat32
doubleFloat64
int32, sint32, sfixed32Int32
int64, sint64, sfixed64Int64
uint32, fixed32UInt32
uint64, fixed64UInt64
string, bytesString
enumEnum
repeated TArray(T)
message, groupTuple

CapnProto

CapnProtoフォーマットのスキーマ推論の際、ClickHouseは以下のタイプマッチを使用します。

CapnProtoデータ型ClickHouseデータ型
BoolUInt8
Int8Int8
UInt8UInt8
Int16Int16
UInt16UInt16
Int32Int32
UInt32UInt32
Int64Int64
UInt64UInt64
Float32Float32
Float64Float64
Text, DataString
enumEnum
ListArray
structTuple
union(T, Void), union(Void, T)Nullable(T)

強型バイナリフォーマット

そのようなフォーマットでは、各シリアライズされた値がその型の情報(おそらく名前についての情報も)を含みますが、テーブル全体に関する情報はありません。 そのようなフォーマットのスキーマ推論の際、ClickHouseはデータを行単位で読み取り(最大 input_format_max_rows_to_read_for_schema_inference 行または input_format_max_bytes_to_read_for_schema_inference バイト)、各値の型(おそらく名前も)をデータから抽出し、これらの型をClickHouse型に変換します。

MsgPack

MsgPackフォーマットには行間の区切りがないため、このフォーマットのスキーマ推論を使用するには、設定 input_format_msgpack_number_of_columns を使用してテーブルのカラム数を指定する必要があります。ClickHouseは以下のタイプマッチを使用します。

MessagePackデータ型 (INSERT)ClickHouseデータ型
int N, uint N, negative fixint, positive fixintInt64
boolUInt8
fixstr, str 8, str 16, str 32, bin 8, bin 16, bin 32String
float 32Float32
float 64Float64
uint 16Date
uint 32DateTime
uint 64DateTime64
fixarray, array 16, array 32Array
fixmap, map 16, map 32Map

デフォルトでは、すべての推論された型は Nullable の中にありますが、schema_inference_make_columns_nullable 設定を使用して変更できます。

BSONEachRow

BSONEachRowでは、データの各行がBSONドキュメントとして表示されます。スキーマ推論の際、ClickHouseはBSONドキュメントを1つずつ読み取り、データから値、名前、型を抽出し、これらの型を以下のタイプマッチを使用してClickHouse型に変換します。

BSONタイプClickHouse型
\x08 booleanBool
\x10 int32Int32
\x12 int64Int64
\x01 doubleFloat64
\x09 datetimeDateTime64
\x05 binary with\x00 binary subtype, \x02 string, \x0E symbol, \x0D JavaScript codeString
\x07 ObjectId,FixedString(12)
\x05 binary with \x04 uuid subtype, size = 16UUID
\x04 arrayArray/Tuple (ネストされた型が異なる場合)
\x03 documentNamed Tuple/Map (文字列キーを持つ)

デフォルトでは、すべての推論された型は Nullable の中にありますが、schema_inference_make_columns_nullable 設定を使用して変更できます。

定数スキーマを持つフォーマット

そのようなフォーマットのデータは常に同じスキーマを持ちます。

LineAsString

このフォーマットでは、ClickHouseはデータから全行を単一のカラムに String データ型として読み込みます。このフォーマットの推論された型は常に String で、カラム名は line です。

JSONAsString

このフォーマットでは、ClickHouseはデータから全JSONオブジェクトを単一のカラムに String データ型として読み込みます。このフォーマットの推論された型は常に String で、カラム名は json です。

JSONAsObject

このフォーマットでは、ClickHouseはデータから全JSONオブジェクトを単一のカラムに Object('json') データ型として読み込みます。このフォーマットの推論された型は常に String で、カラム名は json です。

注意:このフォーマットは allow_experimental_object_type が有効な場合にのみ機能します。

スキーマ推論モード

データファイルのセットからのスキーマ推論は、defaultunion の2つの異なるモードで動作できます。 モードは設定 schema_inference_mode によって制御されます。

デフォルトモード

デフォルトモードでは、ClickHouseはすべてのファイルが同じスキーマを持つと仮定し、成功するまでファイルを一つずつ読み取ってスキーマを推論しようとします。

例:

data1.jsonl, data2.jsonl, data3.jsonl という3つのファイルが次の内容を持っているとしましょう。

data1.jsonl:

data2.jsonl:

data3.jsonl:

これらの3つのファイルに対してスキーマ推論を使用してみましょう:

結果:

見ての通り、data3.jsonlfield3 はありません。 これはClickHouseがまず data1.jsonl からスキーマを推論しようとして失敗し(field2 に対してnullのみ)、次に data2.jsonl から推論し成功し、したがって data3.jsonl のデータが読み取られなかったからです。

ユニオンモード

ユニオンモードでは、ClickHouseはファイルが異なるスキーマを持つ可能性があると見なし、すべてのファイルのスキーマを推論し、それらを共通スキーマにユニオンします。

data1.jsonl, data2.jsonl, data3.jsonl という3つのファイルが次の内容を持っているとしましょう。

data1.jsonl:

data2.jsonl:

data3.jsonl:

これらの3つのファイルに対してスキーマ推論を使用してみましょう:

結果:

見ると、すべてのファイルからのフィールドがあります。

注意:

  • 一部のファイルに結果スキーマからのカラムが存在しない可能性があるため、ユニオンモードはカラムのサブセットを読み取ることがサポートされているフォーマット(例えば、JSONEachRow、Parquet、TSVWithNamesなど)のみにサポートされ、他のフォーマット(例えば、CSV、TSV、JSONCompactEachRowなど)では機能しません。
  • ClickHouseがファイルの一つからスキーマを推論できない場合、例外がスローされます。
  • もし多くのファイルがある場合、すべてのファイルからスキーマを読み取ることは時間がかかる可能性があります。

自動フォーマット検出

データフォーマットが指定されず、ファイル拡張子で決定できない場合、ClickHouseは内容によってファイルフォーマットを検出しようとします。

例:

data というファイルの内容が以下のようになっているとしましょう:

フォーマットや構造を指定せずにこのファイルを調べてクエリできます:

注記

ClickHouseは一部のフォーマットのみしか検出できず、検出には時間がかかるため、常にフォーマットを明示的に指定することをお勧めします。