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은 무시돼요(0077로 읽힘). 음수가 아닌 숫자는 음수 부호를 가질 수 없어요. 읽을 때 빈 문자열을 0으로 파싱하거나(부호 있는 타입의 경우) 빈 문자열을 마이너스 부호 하나뿐인 문자열로 0으로 파싱하는 것이 허용됩니다. 해당 데이터 타입에 맞지 않는 숫자는 오류 메시지 없이 다른 숫자로 파싱될 수 있어요. 부동소수점 숫자는 십진수 형태로 기록됩니다. 소수 구분자는 점(dot)이 사용돼요. 지수 표기, inf, +inf, -inf, nan도 지원됩니다. 부동소수점 숫자는 소수점으로 시작하거나 끝날 수 있어요. 형식화하는 동안 부동소수점 숫자의 정밀도가 손실될 수 있습니다. 파싱할 때 가장 가까운 기계가 표현 가능한 숫자를 반드시 읽어야 하는 것은 아니에요. 날짜는 YYYY-MM-DD 형식으로 기록되고 같은 형식으로 파싱되지만, 구분자로는 어떤 문자든 허용됩니다. 날짜와 시간은 YYYY-MM-DD hh:mm:ss 형식으로 기록되고 같은 형식으로 파싱되지만, 구분자로는 어떤 문자든 허용됩니다. 이 모든 과정은 클라이언트나 서버가 시작된 시점의 시스템 시간대에서 일어나요(어느 쪽이 데이터를 형식화하느냐에 따라 달라짐). 날짜와 시간의 경우 일광 절약 시간은 지정되지 않아요. 그래서 덤프에 일광 절약 시간 동안의 시각이 있으면, 그 덤프는 데이터와 일대일로 일치하지 않으며 파싱은 두 시각 중 하나를 선택하게 돼요. 읽기 작업 중에 잘못된 날짜와 날짜+시간은 자연스러운 오버플로 또는 null 날짜 및 시간으로, 오류 메시지 없이 파싱될 수 있어요. 예외적으로, 정확히 10자리 십진수로 이루어진 경우 날짜+시간은 Unix 타임스탬프 형식으로도 파싱할 수 있어요. 그 결과는 시간대에 의존하지 않습니다. YYYY-MM-DD hh:mm:ssNNNNNNNNNN 형식은 자동으로 구분됩니다. 문자열은 백슬래시로 이스케이프된 특수 문자로 출력됩니다. 출력에 사용되는 이스케이프 시퀀스는 \\b, \\f, \\r, \\n, \\t, \\0, \\', \\\\예요. 파싱도 \\a, \\v, \\xHH(16진수 이스케이프 시퀀스) 및 c가 아무 문자나 되는 \\c 시퀀스(이 시퀀스는 c로 변환됨)를 지원합니다. 따라서 데이터를 읽을 때 줄바꿈을 \\n 또는 \\로, 또는 실제 줄바꿈으로 기록할 수 있는 형식을 지원해요. 예를 들어 단어 사이에 공백 대신 줄바꿈이 있는 문자열 Hello world는 다음 변형 중 어느 것으로든 파싱할 수 있어요:

Hello\nworld

Hello\
world

두 번째 변형은 MySQL이 탭으로 구분된 덤프를 쓸 때 사용하기 때문에 지원됩니다. TabSeparated 포맷으로 데이터를 전달할 때 이스케이프해야 하는 최소 문자 집합은 탭, 줄바꿈(LF), 백슬래시예요. 이스케이프되는 기호는 아주 적습니다. 출력에서 터미널이 망가뜨리는 문자열 값을 쉽게 만날 수 있어요. 배열은 [] 안에 쉼표로 구분된 값 목록으로 기록됩니다. 배열의 숫자 항목은 일반적으로 형식화돼요. DateDateTime 타입은 작은따옴표로 기록됩니다. 문자열은 위와 같은 이스케이프 규칙으로 작은따옴표로 기록돼요. NULLformat_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

더 알아보기 (Learn more)