본문으로 바로가기
본문으로 바로가기

쿼리 처리를 위한 외부 데이터

ClickHouse에서는 SELECT 쿼리와 함께, 해당 쿼리를 처리하는 데 필요한 데이터를 서버로 전송할 수 있습니다. 이 데이터는 임시 테이블(「임시 테이블(Temporary tables)」 섹션 참고)에 저장되며, 쿼리에서 사용할 수 있습니다(예: IN 연산자에서 사용).

예를 들어, 중요한 사용자 식별자가 포함된 텍스트 파일이 있는 경우, 이 목록을 사용해 필터링하는 쿼리와 함께 서버로 업로드할 수 있습니다.

대량의 외부 데이터를 사용해 여러 개의 쿼리를 실행해야 하는 경우에는 이 기능 사용을 권장하지 않습니다. 그 대신 데이터를 미리 데이터베이스(DB)에 업로드해 두는 편이 더 좋습니다.

외부 데이터는 명령줄 클라이언트(비대화형 모드)나 HTTP 인터페이스를 사용하여 업로드할 수 있습니다.

명령줄 클라이언트에서는 다음 형식으로 매개변수 섹션을 지정할 수 있습니다.

--external --file=... [--name=...] [--format=...] [--types=...|--structure=...]

전송되는 테이블 수만큼 이와 같은 섹션을 여러 개 사용할 수 있습니다.

–external – 절의 시작을 나타냅니다. –file – 테이블 덤프가 들어 있는 파일의 경로 또는 stdin을 의미하는 -입니다. stdin에서는 하나의 테이블만 가져올 수 있습니다.

다음 매개변수는 선택 사항입니다: –name– 테이블 이름입니다. 생략하면 _data가 사용됩니다. –format – 파일에 있는 데이터 포맷입니다. 생략하면 TabSeparated가 사용됩니다.

다음 매개변수 중 하나는 필수입니다:–types – 콤마로 구분된 컬럼 타입 목록입니다. 예: UInt64,String. 컬럼 이름은 _1, _2, ... 와 같이 지정됩니다. –structureUserID UInt64, URL String 형식의 테이블 구조입니다. 컬럼 이름과 타입을 정의합니다.

'file'에 지정된 파일은 'format'에 지정된 포맷과, 'types' 또는 'structure'에 지정된 데이터 타입을 사용하여 파싱됩니다. 테이블은 서버로 업로드되며, 'name'에 지정된 이름을 가진 임시 테이블로 서버에서 액세스할 수 있게 됩니다.

예:

$ echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8
849897
$ cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String'
/bin/sh 20
/bin/false      5
/bin/bash       4
/usr/sbin/nologin       1
/bin/sync       1

HTTP 인터페이스를 사용할 때 외부 데이터는 multipart/form-data 형식으로 전달됩니다. 각 테이블은 별도의 파일로 전송됩니다. 테이블 이름은 파일 이름에서 결정됩니다. query_string에는 name_format, name_types, name_structure 매개변수가 전달되며, 여기서 name은 이 매개변수들이 대응하는 테이블의 이름입니다. 매개변수의 의미는 명령줄 클라이언트를 사용할 때와 동일합니다.

예:

$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv

$ curl -F 'passwd=@passwd.tsv;' 'http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String'
/bin/sh 20
/bin/false      5
/bin/bash       4
/usr/sbin/nologin       1
/bin/sync       1

분산 쿼리를 처리할 때 임시 테이블이 모든 원격 서버로 전송됩니다.