入力データからの自動スキーマ推論
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_strings
と input_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_inference
は25000
input_format_max_bytes_to_read_for_schema_inference
は33554432
(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データ型 |
---|---|
boolean | Bool |
int | Int32 |
int (date) * | Date32 |
long | Int64 |
float | Float32 |
double | Float64 |
bytes , string | String |
fixed | FixedString(N) |
enum | Enum |
array(T) | Array(T) |
union(null, T) , union(T, null) | Nullable(T) |
null | Nullable(Nothing) |
string (uuid) * | UUID |
binary (decimal) * | Decimal(P, S) |
他のAvroタイプはサポートされていません。
Parquet
Parquetフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。
Parquetデータ型 | ClickHouseデータ型 |
---|---|
BOOL | Bool |
UINT8 | UInt8 |
INT8 | Int8 |
UINT16 | UInt16 |
INT16 | Int16 |
UINT32 | UInt32 |
INT32 | Int32 |
UINT64 | UInt64 |
INT64 | Int64 |
FLOAT | Float32 |
DOUBLE | Float64 |
DATE | Date32 |
TIME (ms) | DateTime |
TIMESTAMP , TIME (us, ns) | DateTime64 |
STRING , BINARY | String |
DECIMAL | Decimal |
LIST | Array |
STRUCT | Tuple |
MAP | Map |
他のParquetタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable
の中にありますが、schema_inference_make_columns_nullable
設定を使用して変更できます。
Arrow
Arrowフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。
Arrowデータ型 | ClickHouseデータ型 |
---|---|
BOOL | Bool |
UINT8 | UInt8 |
INT8 | Int8 |
UINT16 | UInt16 |
INT16 | Int16 |
UINT32 | UInt32 |
INT32 | Int32 |
UINT64 | UInt64 |
INT64 | Int64 |
FLOAT , HALF_FLOAT | Float32 |
DOUBLE | Float64 |
DATE32 | Date32 |
DATE64 | DateTime |
TIMESTAMP , TIME32 , TIME64 | DateTime64 |
STRING , BINARY | String |
DECIMAL128 , DECIMAL256 | Decimal |
LIST | Array |
STRUCT | Tuple |
MAP | Map |
他のArrowタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable
の中にありますが、schema_inference_make_columns_nullable
設定を使用して変更できます。
ORC
ORCフォーマットでは、ClickHouseはデータからスキーマを読み取り、以下のタイプマッチを使用してClickHouseスキーマに変換します。
ORCデータ型 | ClickHouseデータ型 |
---|---|
Boolean | Bool |
Tinyint | Int8 |
Smallint | Int16 |
Int | Int32 |
Bigint | Int64 |
Float | Float32 |
Double | Float64 |
Date | Date32 |
Timestamp | DateTime64 |
String , Char , Varchar ,BINARY | String |
Decimal | Decimal |
List | Array |
Struct | Tuple |
Map | Map |
他のORCタイプはサポートされていません。デフォルトでは、すべての推論された型は Nullable
の中にありますが、schema_inference_make_columns_nullable
設定を使用して変更できます。
ネイティブ
ネイティブフォーマットはClickHouse内で使用され、データ内にスキーマが含まれています。 スキーマ推論の際、ClickHouseはデータからスキーマを読み取り、変換を行いません。
外部スキーマを持つフォーマット
そのようなフォーマットでは、特定のスキーマ言語でデータを記述するスキーマを別ファイルに必要とします。 そのようなフォーマットのファイルから自動的にスキーマを推論するために、ClickHouseは別のファイルから外部スキーマを読み取ってClickHouseテーブルスキーマに変換します。
Protobuf
Protobufフォーマットのスキーマ推論の際、ClickHouseは以下のタイプマッチを使用します。
Protobufデータ型 | ClickHouseデータ型 |
---|---|
bool | UInt8 |
float | Float32 |
double | Float64 |
int32 , sint32 , sfixed32 | Int32 |
int64 , sint64 , sfixed64 | Int64 |
uint32 , fixed32 | UInt32 |
uint64 , fixed64 | UInt64 |
string , bytes | String |
enum | Enum |
repeated T | Array(T) |
message , group | Tuple |
CapnProto
CapnProtoフォーマットのスキーマ推論の際、ClickHouseは以下のタイプマッチを使用します。
CapnProtoデータ型 | ClickHouseデータ型 |
---|---|
Bool | UInt8 |
Int8 | Int8 |
UInt8 | UInt8 |
Int16 | Int16 |
UInt16 | UInt16 |
Int32 | Int32 |
UInt32 | UInt32 |
Int64 | Int64 |
UInt64 | UInt64 |
Float32 | Float32 |
Float64 | Float64 |
Text , Data | String |
enum | Enum |
List | Array |
struct | Tuple |
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 fixint | Int64 |
bool | UInt8 |
fixstr , str 8 , str 16 , str 32 , bin 8 , bin 16 , bin 32 | String |
float 32 | Float32 |
float 64 | Float64 |
uint 16 | Date |
uint 32 | DateTime |
uint 64 | DateTime64 |
fixarray , array 16 , array 32 | Array |
fixmap , map 16 , map 32 | Map |
デフォルトでは、すべての推論された型は Nullable
の中にありますが、schema_inference_make_columns_nullable
設定を使用して変更できます。
BSONEachRow
BSONEachRowでは、データの各行がBSONドキュメントとして表示されます。スキーマ推論の際、ClickHouseはBSONドキュメントを1つずつ読み取り、データから値、名前、型を抽出し、これらの型を以下のタイプマッチを使用してClickHouse型に変換します。
BSONタイプ | ClickHouse型 |
---|---|
\x08 boolean | Bool |
\x10 int32 | Int32 |
\x12 int64 | Int64 |
\x01 double | Float64 |
\x09 datetime | DateTime64 |
\x05 binary with\x00 binary subtype, \x02 string, \x0E symbol, \x0D JavaScript code | String |
\x07 ObjectId, | FixedString(12) |
\x05 binary with \x04 uuid subtype, size = 16 | UUID |
\x04 array | Array/Tuple (ネストされた型が異なる場合) |
\x03 document | Named 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
が有効な場合にのみ機能します。
例
スキーマ推論モード
データファイルのセットからのスキーマ推論は、default
と union
の2つの異なるモードで動作できます。
モードは設定 schema_inference_mode
によって制御されます。
デフォルトモード
デフォルトモードでは、ClickHouseはすべてのファイルが同じスキーマを持つと仮定し、成功するまでファイルを一つずつ読み取ってスキーマを推論しようとします。
例:
data1.jsonl
, data2.jsonl
, data3.jsonl
という3つのファイルが次の内容を持っているとしましょう。
data1.jsonl
:
data2.jsonl
:
data3.jsonl
:
これらの3つのファイルに対してスキーマ推論を使用してみましょう:
結果:
見ての通り、data3.jsonl
の field3
はありません。
これは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は一部のフォーマットのみしか検出できず、検出には時間がかかるため、常にフォーマットを明示的に指定することをお勧めします。