사용법
structure가 있습니다. 이 인수를 지정하지 않거나 auto로 설정하면 데이터에서 구조를 추론합니다.
예시:
예를 들어, user_files 디렉터리에 다음 내용이 들어 있는 JSONEachRow 포맷의 hobbies.jsonl 파일이 있다고 가정하겠습니다:
JSONEachRow는 파일 확장자 .jsonl을 기준으로 자동으로 판별되었습니다.
DESCRIBE 쿼리를 사용하면 자동으로 판별된 구조를 확인할 수 있습니다:
CREATE TABLE 쿼리에서 컬럼 목록을 지정하지 않으면 테이블 구조가 데이터에서 자동으로 추론됩니다.
예시:
hobbies.jsonl 파일을 사용해 보겠습니다. 이 파일의 데이터를 사용해 테이블 엔진 File을 사용하는 테이블을 생성할 수 있습니다:
clickhouse-local
clickhouse-local에는 입력 데이터의 구조를 지정하는 선택적 매개변수 -S/--structure가 있습니다. 이 매개변수를 지정하지 않거나 auto로 설정하면 데이터로부터 구조를 추론합니다.
예시:
hobbies.jsonl 파일을 사용해 보겠습니다. clickhouse-local을 사용하면 이 파일의 데이터에 쿼리할 수 있습니다:
삽입 테이블의 구조 사용
file/s3/url/hdfs를 사용해 테이블에 데이터를 삽입할 때
데이터에서 구조를 추출하는 대신 삽입 테이블의 구조를 사용하는 옵션이 있습니다.
스키마 추론에 시간이 걸릴 수 있으므로 삽입 성능을 높일 수 있습니다. 또한 테이블에 최적화된 스키마가 있으면
타입 간 변환이 수행되지 않으므로 더욱 유용합니다.
이 동작을 제어하는 특수한 SETTING use_structure_from_insertion_table_in_table_functions이 있습니다.
이 SETTING에는 3개의 가능한 값이 있습니다:
- 0 - 테이블 함수가 데이터에서 구조를 추출합니다.
- 1 - 테이블 함수가 삽입 테이블의 구조를 사용합니다.
- 2 - ClickHouse가 삽입 테이블의 구조를 사용할 수 있는지, 아니면 스키마 추론을 사용해야 하는지를 자동으로 판단합니다. 기본값입니다.
hobbies1 테이블을 생성해 보겠습니다:
hobbies.jsonl 파일에서 데이터를 삽입합니다:
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입니다. 이 SETTING은 서버 구성 파일에서 지정해야 합니다.schema_inference_use_cache_for_{file,s3,hdfs,url,azure}- 스키마 추론 시 캐시 사용 여부를 켜거나 끌 수 있습니다. 이 SETTING은 쿼리에서 사용할 수 있습니다.
url 테이블 함수에서 URL을 통해 접근하는 일부 파일에는 마지막 수정 시간 정보가 없을 수 있습니다. 이러한 경우를 위한 전용 SETTING
schema_inference_cache_require_modification_time_for_url가 있습니다. 이 SETTING을 비활성화하면 이러한 파일에 대해 마지막 수정 시간이 없어도 캐시의 스키마를 사용할 수 있습니다.
또한 현재 캐시에 있는 모든 스키마를 보여주는 시스템 테이블(system table) schema_inference_cache와, 모든 소스 또는 특정 소스에 대한 스키마 캐시를 정리할 수 있는 시스템 쿼리(system query) SYSTEM CLEAR SCHEMA CACHE [FOR File/S3/URL/HDFS]
도 있습니다.
예시:
S3의 샘플 데이터셋 github-2022.ndjson.gz에서 구조를 추론해 보고, 스키마 추론 캐시가 어떻게 동작하는지 살펴보겠습니다:
system.schema_inference_cache table의 내용을 확인해 보겠습니다:
텍스트 형식
input_format_max_rows_to_read_for_schema_inference(기본값 25000) 및 input_format_max_bytes_to_read_for_schema_inference(기본값 32Mb)로 제어됩니다.
기본적으로 추론된 모든 타입은 널 허용이지만, schema_inference_make_columns_nullable 설정을 사용해 이를 변경할 수 있습니다(설정 섹션의 예시 참조).
JSON 포맷
null이 포함된 경우, ClickHouse는 다른 배열 요소의 타입을 사용합니다:
input_format_json_infer_array_of_dynamic_from_array_of_different_types 설정이 활성화되어 있으면(기본값으로 활성화됨), 해당 배열은 Array(Dynamic) 타입으로 처리됩니다:
input_format_json_try_infer_named_tuples_from_objects 설정을 활성화하면 스키마 추론 중에 ClickHouse가 JSON 객체에서 named Tuple을 추론하려고 합니다.
그 결과 생성된 named Tuple에는 샘플 데이터에서 해당하는 모든 JSON 객체의 모든 요소가 포함됩니다.
input_format_json_infer_array_of_dynamic_from_array_of_different_types가 비활성화되어 있으면, JSON 포맷에서는 요소 타입이 서로 다른 배열을 이름 없는 튜플로 처리합니다.
null이거나 비어 있으면, 다른 행의 해당 값 타입을 사용합니다:
input_format_json_read_objects_as_strings 및 input_format_json_try_infer_named_tuples_from_objects가 비활성화된 경우에만 동작합니다.
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
Query
Response
Query
Response
input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects
input_format_json_try_infer_named_tuples_from_objects가 활성화된 경우) 모호한 경로에 대해 예외 대신 String 유형을 사용할 수 있습니다.
따라서 모호한 경로가 있더라도 JSON 객체를 이름이 지정된 named tuple로 읽을 수 있습니다.
기본적으로 비활성화되어 있습니다.
예시
SETTING이 비활성화된 경우:
Query
Response
Query
Response
input_format_json_read_objects_as_strings
input_format_json_try_infer_named_tuples_from_objects SETTING이 비활성화된 경우에만 적용됩니다.
input_format_json_read_numbers_as_strings
input_format_json_read_bools_as_numbers
input_format_json_read_bools_as_strings
input_format_json_read_arrays_as_strings
input_format_json_infer_incomplete_types_as_strings
Null/{}/[]만 포함된 JSON 키에 String 타입을 사용할 수 있습니다.
JSON 포맷에서는 해당하는 설정이 모두 활성화되어 있으면(기본값으로 모두 활성화되어 있습니다) 어떤 값이든 String으로 읽을 수 있으므로, 타입을 알 수 없는 키에 String 타입을 사용해 스키마 추론 중 Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps와 같은 오류를 방지할 수 있습니다.
예시:
Query
Response
CSV
input_format_csv_use_best_effort_in_schema_inference 설정을 비활성화하면 됩니다.
그러면 ClickHouse는 모든 컬럼을 String으로 처리합니다.
input_format_csv_detect_header 설정이 활성화되어 있으면 ClickHouse는 스키마를 추론하는 동안 컬럼 이름(경우에 따라 타입도 포함)이 있는 헤더를 감지하려고 시도합니다. 이 설정은 기본적으로 활성화되어 있습니다.
예시:
정수, 부동소수점 수, Bool, 문자열:
input_format_csv_use_best_effort_in_schema_inference 설정을 비활성화한 예시:
input_format_csv_detect_header가 활성화되었을 때):
이름만 있는 경우:
CSV 설정
input_format_csv_try_infer_numbers_from_strings
TSV/TSKV
input_format_tsv_use_best_effort_in_schema_inference 설정을 비활성화하십시오.
그러면 ClickHouse는 모든 컬럼을 String으로 처리합니다.
input_format_tsv_detect_header 설정이 활성화되어 있으면 ClickHouse는 스키마를 추론하는 동안 컬럼 이름(경우에 따라 타입도 포함)으로 이루어진 헤더를 감지하려고 시도합니다. 이 설정은 기본적으로 활성화되어 있습니다.
예시:
정수, 부동소수점, Bool, String:
input_format_tsv_use_best_effort_in_schema_inference이 비활성화된 예시:
input_format_tsv_detect_header가 활성화된 경우):
이름만 있는 경우:
String이 아닌 유형의 컬럼이 하나 이상 있는 경우에만 헤더를 감지할 수 있습니다. 모든 컬럼이 String 유형이면 헤더는 감지되지 않습니다:
값(Values)
input_format_tsv_use_best_effort_in_schema_inference 설정을 비활성화한 예시:
CustomSeparated
input_format_custom_detect_header가 활성화되어 있으면, ClickHouse는 스키마를 추론하는 동안 컬럼 이름(필요에 따라 타입도 포함)이 있는 헤더를 감지하려고 시도합니다. 이 설정은 기본적으로 활성화되어 있습니다.
예시
input_format_custom_detect_header가 활성화된 경우):
Template
resultset 파일이 있다고 가정하겠습니다:
row_format:
Regexp
형식 설정
input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference
input_format_max_rows_to_read_for_schema_inference의 경우25000input_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
schema_inference_make_columns_nullable $
Nullable로 설정할지 여부를 제어합니다. 가능한 값:
- 0 - 추론된 유형은
Nullable이 될 수 없습니다, - 1 - 추론된 모든 타입이
Nullable이 됩니다, - 2 또는 ‘auto’ - 텍스트 형식의 경우, 스키마 추론 중 파싱되는 샘플에서 컬럼에
NULL이 포함된 경우에만 추론된 유형이Nullable이 되며, 강한 타입의 포맷(Parquet, ORC, Arrow)에서는 널 허용 정보가 파일 메타데이터에서 가져옵니다, - 3 - 텍스트 형식에는
Nullable를 사용하고, 강한 타입의 포맷에는 파일 메타데이터를 사용합니다.
input_format_try_infer_integers
이 설정은
JSON 데이터 타입에는 적용되지 않습니다.Int64이고, 하나 이상의 숫자가 부동소수점 수이면 결과 타입은 Float64입니다.
샘플 데이터에 정수만 포함되어 있고, 정수 중 하나 이상이 양수이면서 Int64 오버플로우가 발생하면 ClickHouse는 UInt64를 추론합니다.
기본적으로 활성화되어 있습니다.
예시
input_format_try_infer_datetimes
DateTime 또는 DateTime64 유형을 추론하려고 시도합니다.
샘플 데이터에서 하나의 컬럼에 있는 모든 필드가 datetime으로 성공적으로 파싱되면 결과 유형은 DateTime 또는 DateTime64(9)(datetime 중 하나라도 소수 부분이 있는 경우)이며,
하나 이상의 필드가 datetime으로 파싱되지 않으면 결과 유형은 String이 됩니다.
기본적으로 활성화되어 있습니다.
예시
input_format_try_infer_datetimes_only_datetime64
input_format_try_infer_datetimes가 활성화된 경우 datetime 값에 소수 부분이 없더라도 ClickHouse는 항상 DateTime64(9)로 추론합니다.
기본값은 비활성화입니다.
예시
input_format_try_infer_dates
Date 유형을 추론하려고 합니다.
샘플 데이터에서 특정 컬럼의 모든 필드가 날짜로 성공적으로 파싱되면 결과 유형은 Date가 되고,
필드 중 하나라도 날짜로 파싱되지 않으면 결과 유형은 String이 됩니다.
기본적으로 활성화되어 있습니다.
예시
input_format_try_infer_exponent_floats
자체 설명형 포맷
-WithNamesAndTypes 접미사가 붙은 포맷
메타데이터가 포함된 JSON 포맷
Avro
그 외 Avro 타입은 지원되지 않습니다.
Parquet
그 밖의 Parquet 타입은 지원되지 않습니다.
Arrow
그 밖의 Arrow 타입은 지원되지 않습니다.
ORC
그 외 ORC 타입은 지원되지 않습니다.
Native
외부 스키마가 있는 포맷
Protobuf
CapnProto
강타입 바이너리 형식
input_format_max_rows_to_read_for_schema_inference행 또는 input_format_max_bytes_to_read_for_schema_inference바이트까지), 데이터에서 각 값의 타입(경우에 따라 이름도)을 추출한 다음 이를 ClickHouse 타입으로 변환합니다.
MsgPack
input_format_msgpack_number_of_columns을 사용해 테이블의 컬럼 수를 지정해야 합니다. ClickHouse는 다음과 같은 타입 매핑을 사용합니다:
기본적으로 추론된 모든 타입은
Nullable로 감싸지지만, 설정 schema_inference_make_columns_nullable을 사용해 이를 변경할 수 있습니다.
BSONEachRow
기본적으로 추론된 모든 타입은
Nullable로 감싸지지만, schema_inference_make_columns_nullable 설정으로 변경할 수 있습니다.
고정 스키마 포맷
LineAsString
String 데이터 타입의 단일 컬럼으로 읽습니다. 이 포맷에서 추론되는 타입은 항상 String이며, 컬럼 이름은 line입니다.
예시
JSONAsString
String 데이터 타입의 단일 컬럼에 읽어들입니다. 이 포맷에서 추론되는 타입은 항상 String이며, 컬럼 이름은 json입니다.
예시
JSONAsObject
JSON 데이터 타입의 단일 컬럼으로 읽어들입니다. 이 포맷에서 추론되는 타입은 항상 JSON이며, 컬럼 이름은 json입니다.
예시
스키마 추론 모드
default와 union의 2가지 모드로 작동할 수 있습니다.
모드는 schema_inference_mode 설정으로 제어됩니다.
기본 모드
data1.jsonl, data2.jsonl, data3.jsonl이라는 3개의 파일이 있고, 내용은 다음과 같다고 가정하겠습니다:
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
data3.jsonl의 field3는 포함되지 않았습니다.
이는 ClickHouse가 먼저 파일 data1.jsonl에서 스키마를 추론하려 했지만 field2 필드가 null뿐이어서 실패했고,
이후 data2.jsonl에서 스키마 추론에 성공했기 때문에 파일 data3.jsonl의 데이터는 읽지 않았기 때문입니다.
Union mode
data1.jsonl, data2.jsonl, data3.jsonl이 있다고 가정하겠습니다.
data1.jsonl:
data2.jsonl:
data3.jsonl:
Query
Response
- 일부 파일에는 결과 스키마의 일부 컬럼이 없을 수 있으므로, union mode는 컬럼 부분 집합 읽기를 지원하는 포맷(JSONEachRow, Parquet, TSVWithNames 등)에서만 지원되며 다른 포맷(CSV, TSV, JSONCompactEachRow 등)에서는 작동하지 않습니다.
- ClickHouse가 파일 중 하나에서 스키마를 추론하지 못하면 예외가 발생합니다.
- 파일이 많으면 모든 파일에서 스키마를 읽는 데 시간이 많이 걸릴 수 있습니다.
자동 포맷 감지
data가 있다고 가정해 보겠습니다:
ClickHouse는 일부 포맷만 감지할 수 있으며, 이 감지에도 시간이 걸리므로 포맷은 항상 명시적으로 지정하는 것이 좋습니다.