input
input
서버로 전송된 특정 구조의 데이터를 다른 구조의 테이블로 효율적으로 변환해 삽입할 수 있게 해주는 테이블 함수예요.
출처: 문서
본문
input(structure) — 서버로 전송된 특정 구조의 데이터를 다른 구조의 테이블로 효율적으로 변환하고 삽입할 수 있게 해주는 테이블 함수예요.
structure — 서버로 전송되는 데이터의 구조로, 'column1_name column1_type, column2_name column2_type, ...' 형태예요. 예를 들어 'id UInt32, name String'처럼요.
이 함수는 INSERT SELECT 쿼리에서만, 그리고 딱 한 번만 사용할 수 있어요. 그 외에는 일반 테이블 함수처럼 동작해요(예: 서브쿼리에서 사용 가능).
데이터는 일반 INSERT 쿼리처럼 어떤 방식으로든 보낼 수 있고, 사용 가능한 포맷으로 전달할 수 있어요. 포맷은 일반 INSERT SELECT와 달리 쿼리 끝에 지정해야 해요.
이 함수의 핵심 특징은 서버가 클라이언트로부터 데이터를 받을 때 동시에 SELECT 절의 표현식 목록에 따라 데이터를 변환하고 대상 테이블에 삽입한다는 점이에요. 전송된 전체 데이터를 담는 임시 테이블은 만들지 않아요.
예시 (Examples)
test 테이블이 (a String, b String) 구조를 갖고 있고, data.csv의 데이터가 (col1 String, col2 Date, col3 Int32)라는 다른 구조라고 가정해볼게요. data.csv의 데이터를 동시에 변환하며 test 테이블에 삽입하는 쿼리는 다음과 같아요:
$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV";
data.csv에 test 테이블과 같은 구조인 test_structure의 데이터가 들어 있다면, 다음 두 쿼리는 동일해요:
$ cat data.csv | clickhouse-client --query="INSERT INTO test FORMAT CSV"
$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT * FROM input('test_structure') FORMAT CSV"