TabSeparated
TabSeparated
TabSeparated 포맷은 값을 탭으로 구분해 행 단위로 쓰는 ClickHouse의 기본 텍스트 포맷이에요. 별칭은 TSV이며, HTTP 인터페이스와 커맨드라인 클라이언트의 배치 모드에서 기본으로 사용됩니다. 특수 문자는 이스케이프되지만 값을 따옴표로 묶지는 않는 방식이라, 커스텀 프로그램이나 스크립트로 처리하기에 편리해요.
출처: 문서
본문
| Input | Output | Alias |
|---|---|---|
| ✔ | ✔ | TSV |
Description
TabSeparated 포맷에서는 데이터가 행 단위로 기록돼요. 각 행에는 탭으로 구분된 값들이 들어갑니다. 각 값 다음에는 탭이 오며, 행의 마지막 값 다음에는 줄바꿈(line feed)이 와요. 어디서든 엄격하게 Unix 줄바꿈이 가정됩니다. 마지막 행도 끝에 줄바꿈을 포함해야 해요. 값은 따옴표로 묶지 않은 채 텍스트 형식으로 기록되며, 특수 문자는 이스케이프됩니다.
이 포맷은 TSV라는 이름으로도 제공돼요.
TabSeparated 포맷은 커스텀 프로그램과 스크립트를 사용해 데이터를 처리하기에 편리합니다. HTTP 인터페이스와 커맨드라인 클라이언트의 배치 모드에서 기본으로 사용돼요. 이 포맷은 서로 다른 DBMS 간에 데이터를 전송할 때도 사용할 수 있어요. 예를 들어 MySQL에서 덤프를 받아 ClickHouse에 올리거나, 그 반대도 가능합니다.
TabSeparated 포맷은 (WITH TOTALS 사용 시) 합계 값과 ('extremes'가 1로 설정된 경우) 극값의 출력을 지원해요. 이 경우 합계 값과 극값은 주요 데이터 뒤에 출력됩니다. 주요 결과, 합계 값, 극값은 서로 빈 줄로 구분돼요. 예시:
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated
2014-03-17 1406958
2014-03-18 1383658
2014-03-19 1405797
2014-03-20 1353623
2014-03-21 1245779
2014-03-22 1031592
2014-03-23 1046491
1970-01-01 8873898
2014-03-17 1031592
2014-03-23 1406958
Data formatting
정수는 십진수 형태로 기록됩니다. 숫자는 시작 부분에 추가 ”+” 문자를 포함할 수 있는데(파싱 시 무시되고, 형식화 시에는 기록되지 않아요), 파싱 시 앞의 0은 무시돼요(007은 7로 읽힘). 음수가 아닌 숫자는 음수 부호를 가질 수 없어요. 읽을 때 빈 문자열을 0으로 파싱하거나(부호 있는 타입의 경우) 빈 문자열을 마이너스 부호 하나뿐인 문자열로 0으로 파싱하는 것이 허용됩니다. 해당 데이터 타입에 맞지 않는 숫자는 오류 메시지 없이 다른 숫자로 파싱될 수 있어요.
부동소수점 숫자는 십진수 형태로 기록됩니다. 소수 구분자는 점(dot)이 사용돼요. 지수 표기, inf, +inf, -inf, nan도 지원됩니다. 부동소수점 숫자는 소수점으로 시작하거나 끝날 수 있어요.
형식화하는 동안 부동소수점 숫자의 정밀도가 손실될 수 있습니다.
파싱할 때 가장 가까운 기계가 표현 가능한 숫자를 반드시 읽어야 하는 것은 아니에요.
날짜는 YYYY-MM-DD 형식으로 기록되고 같은 형식으로 파싱되지만, 구분자로는 어떤 문자든 허용됩니다.
날짜와 시간은 YYYY-MM-DD hh:mm:ss 형식으로 기록되고 같은 형식으로 파싱되지만, 구분자로는 어떤 문자든 허용됩니다.
이 모든 과정은 클라이언트나 서버가 시작된 시점의 시스템 시간대에서 일어나요(어느 쪽이 데이터를 형식화하느냐에 따라 달라짐). 날짜와 시간의 경우 일광 절약 시간은 지정되지 않아요. 그래서 덤프에 일광 절약 시간 동안의 시각이 있으면, 그 덤프는 데이터와 일대일로 일치하지 않으며 파싱은 두 시각 중 하나를 선택하게 돼요.
읽기 작업 중에 잘못된 날짜와 날짜+시간은 자연스러운 오버플로 또는 null 날짜 및 시간으로, 오류 메시지 없이 파싱될 수 있어요.
예외적으로, 정확히 10자리 십진수로 이루어진 경우 날짜+시간은 Unix 타임스탬프 형식으로도 파싱할 수 있어요. 그 결과는 시간대에 의존하지 않습니다. YYYY-MM-DD hh:mm:ss와 NNNNNNNNNN 형식은 자동으로 구분됩니다.
문자열은 백슬래시로 이스케이프된 특수 문자로 출력됩니다. 출력에 사용되는 이스케이프 시퀀스는 \\b, \\f, \\r, \\n, \\t, \\0, \\', \\\\예요. 파싱도 \\a, \\v, \\xHH(16진수 이스케이프 시퀀스) 및 c가 아무 문자나 되는 \\c 시퀀스(이 시퀀스는 c로 변환됨)를 지원합니다. 따라서 데이터를 읽을 때 줄바꿈을 \\n 또는 \\로, 또는 실제 줄바꿈으로 기록할 수 있는 형식을 지원해요. 예를 들어 단어 사이에 공백 대신 줄바꿈이 있는 문자열 Hello world는 다음 변형 중 어느 것으로든 파싱할 수 있어요:
Hello\nworld
Hello\
world
두 번째 변형은 MySQL이 탭으로 구분된 덤프를 쓸 때 사용하기 때문에 지원됩니다.
TabSeparated 포맷으로 데이터를 전달할 때 이스케이프해야 하는 최소 문자 집합은 탭, 줄바꿈(LF), 백슬래시예요. 이스케이프되는 기호는 아주 적습니다. 출력에서 터미널이 망가뜨리는 문자열 값을 쉽게 만날 수 있어요.
배열은 [] 안에 쉼표로 구분된 값 목록으로 기록됩니다. 배열의 숫자 항목은 일반적으로 형식화돼요. Date와 DateTime 타입은 작은따옴표로 기록됩니다. 문자열은 위와 같은 이스케이프 규칙으로 작은따옴표로 기록돼요.
NULL은 format_tsv_null_representation 설정(기본값 \\N)에 따라 형식화됩니다.
입력 데이터에서 ENUM 값은 이름 또는 id로 표현될 수 있어요. 먼저 입력 값을 ENUM 이름과 매칭하려고 시도합니다. 실패하고 입력 값이 숫자라면, 그 숫자를 ENUM id와 매칭하려고 시도해요.
입력 데이터에 ENUM id만 들어 있다면, ENUM 파싱을 최적화하기 위해 input_format_tsv_enum_as_number 설정을 활성화하는 것이 좋습니다.
Nested 구조의 각 요소는 배열로 표현됩니다. 예를 들면:
CREATE TABLE nestedt
(
`id` UInt8,
`aux` Nested(
a UInt8,
b String
)
)
ENGINE = TinyLog
INSERT INTO nestedt VALUES ( 1, [1], ['a'])
SELECT * FROM nestedt FORMAT TSV
1 [1] ['a']
Example usage
Inserting data
football.tsv라는 다음 tsv 파일을 사용할게요:
2022-04-30 2021 Sutton United Bradford City 1 4
2022-04-30 2021 Swindon Town Barrow 2 1
2022-04-30 2021 Tranmere Rovers Oldham Athletic 2 0
2022-05-02 2021 Port Vale Newport County 1 2
2022-05-02 2021 Salford City Mansfield Town 2 2
2022-05-07 2021 Barrow Northampton Town 1 3
2022-05-07 2021 Bradford City Carlisle United 2 0
2022-05-07 2021 Bristol Rovers Scunthorpe United 7 0
2022-05-07 2021 Exeter City Port Vale 0 1
2022-05-07 2021 Harrogate Town A.F.C. Sutton United 0 2
2022-05-07 2021 Hartlepool United Colchester United 0 2
2022-05-07 2021 Leyton Orient Tranmere Rovers 0 1
2022-05-07 2021 Mansfield Town Forest Green Rovers 2 2
2022-05-07 2021 Newport County Rochdale 0 2
2022-05-07 2021 Oldham Athletic Crawley Town 3 3
2022-05-07 2021 Stevenage Borough Salford City 4 2
2022-05-07 2021 Walsall Swindon Town 0 3
데이터를 삽입해요:
INSERT INTO football FROM INFILE 'football.tsv' FORMAT TabSeparated;
Reading data
TabSeparated 포맷으로 데이터를 읽어요:
SELECT *
FROM football
FORMAT TabSeparated
출력은 탭으로 구분된 형식이 될 거예요:
2022-04-30 2021 Sutton United Bradford City 1 4
2022-04-30 2021 Swindon Town Barrow 2 1
2022-04-30 2021 Tranmere Rovers Oldham Athletic 2 0
2022-05-02 2021 Port Vale Newport County 1 2
2022-05-02 2021 Salford City Mansfield Town 2 2
2022-05-07 2021 Barrow Northampton Town 1 3
2022-05-07 2021 Bradford City Carlisle United 2 0
2022-05-07 2021 Bristol Rovers Scunthorpe United 7 0
2022-05-07 2021 Exeter City Port Vale 0 1
2022-05-07 2021 Harrogate Town A.F.C. Sutton United 0 2
2022-05-07 2021 Hartlepool United Colchester United 0 2
2022-05-07 2021 Leyton Orient Tranmere Rovers 0 1
2022-05-07 2021 Mansfield Town Forest Green Rovers 2 2
2022-05-07 2021 Newport County Rochdale 0 2
2022-05-07 2021 Oldham Athletic Crawley Town 3 3
2022-05-07 2021 Stevenage Borough Salford City 4 2
2022-05-07 2021 Walsall Swindon Town 0 3
Format settings
| Setting | Description | Default |
|---|---|---|
| format_tsv_null_representation | TSV 포맷에서의 사용자 정의 NULL 표현이에요. | \N |
| input_format_tsv_empty_as_default | TSV 입력에서 빈 필드를 기본값으로 취급할지 여부예요. 복잡한 기본 표현식의 경우 input_format_defaults_for_omitted_fields도 활성화해야 해요. | false |
| input_format_tsv_enum_as_number | TSV 포맷에서 삽입된 enum 값을 enum 인덱스로 취급할지 여부예요. | false |
| input_format_tsv_use_best_effort_in_schema_inference | TSV 포맷에서 스키마를 추론할 때 몇 가지 트릭과 휴리스틱을 사용할지 여부예요. 비활성화하면 모든 필드가 String으로 추론돼요. | true |
| output_format_tsv_crlf_end_of_line | true로 설정하면 TSV 출력 포맷의 줄 끝이 \n 대신 \r\n이 돼요. | false |
| input_format_tsv_crlf_end_of_line | true로 설정하면 TSV 입력 포맷의 줄 끝이 \n 대신 \r\n이 돼요. | false |
| input_format_tsv_skip_first_lines | 데이터 시작 부분의 지정된 줄 수를 건너뛸지 여부예요. | 0 |
| input_format_tsv_detect_header | TSV 포맷에서 이름과 타입이 있는 헤더를 자동으로 감지할지 여부예요. | true |
| input_format_tsv_skip_trailing_empty_lines | 데이터 끝의 빈 줄을 건너뛸지 여부예요. | false |
| input_format_tsv_allow_variable_number_of_columns | TSV 포맷에서 열 개수가 가변적이어도 허용할지 여부예요. 추가 열은 무시하고 누락된 열에는 기본값을 사용해요. | false |