쿼리 처리를 위한 외부 데이터
쿼리 처리를 위한 외부 데이터 (External data for query processing)
ClickHouse는 SELECT 쿼리와 함께 쿼리 처리에 필요한 데이터를 서버에 보내는 것을 지원해요. 이 데이터는 임시 테이블에 넣어져 쿼리에서(예: IN 연산자에서) 사용할 수 있답니다.
출처: 문서
본문
ClickHouse는 쿼리 처리에 필요한 데이터를 SELECT 쿼리와 함께 서버에 보낼 수 있게 합니다. 이 데이터는 임시 테이블( "Temporary tables" 섹션 참조)에 넣어져 쿼리에서(예: IN 연산자에서) 사용될 수 있어요.
예를 들어 중요한 사용자 식별자가 있는 텍스트 파일이 있다면, 이 목록에 의한 필터링을 사용하는 쿼리와 함께 그 파일을 서버에 업로드할 수 있습니다.
대량의 외부 데이터로 여러 쿼리를 실행해야 한다면 이 기능을 사용하지 마세요. 데이터를 미리 DB에 업로드하는 것이 좋아요.
외부 데이터는 커맨드라인 클라이언트(비대화형 모드) 또는 HTTP 인터페이스를 사용하여 업로드할 수 있습니다.
커맨드라인 클라이언트에서 다음 형식의 parameters 섹션을 지정할 수 있어요:
--external --file=... [--name=...] [--format=...] [--types=...|--structure=...] [--scalar]
전송되는 테이블의 수만큼 이와 같은 섹션을 여러 개 가질 수 있습니다.
--external— 절의 시작을 표시합니다.--file— 테이블 덤프가 있는 파일의 경로, 또는 stdin을 가리키는-. stdin에서는 단일 테이블만 가져올 수 있습니다.
다음 매개변수는 선택 사항입니다:
--name— 테이블의 이름. 생략하면_data가 사용됩니다.--format— 파일의 데이터 형식. 생략하면TabSeparated가 사용됩니다.--scalar— 임시 테이블 대신 스칼라로 데이터를 보냅니다. 데이터는 정확히 한 개의 행을 포함해야 하며, 여러 컬럼을 포함하면 단일 튜플로 묶입니다. 값은 쿼리에서__getScalar('name')을 통해 접근할 수 있어요.
다음 매개변수 중 하나는 필수입니다:
--types— 쉼표로 구분된 컬럼 타입 목록. 예:UInt64,String. 컬럼 이름은_1, _2, ...가 됩니다.--structure— 형식의 테이블 구조UserID 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
$ echo 41 | clickhouse-client --query="SELECT __getScalar('threshold') + 1" --external --scalar --name=threshold --file=- --types=UInt64
42
HTTP 인터페이스를 사용할 때 외부 데이터는 multipart/form-data 형식으로 전달됩니다. 각 테이블은 별도의 파일로 전송됩니다. 테이블 이름은 파일 이름에서 가져옵니다. query_string에는 name_format, name_types, name_structure 매개변수가 전달되며, 여기서 name은 해당 매개변수가 대응하는 테이블의 이름입니다. 매개변수의 의미는 커맨드라인 클라이언트를 사용할 때와 동일합니다.
예시:
$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv
$ curl -F '[email protected];' '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
분산 쿼리 처리를 위해 임시 테이블은 모든 원격 서버로 전송됩니다.