4. 로드
IRIS는 외부 시스템에서 대량의 벌크 데이터를 한꺼번에 IRIS에 로드할 수 있는 기능을 제공합니다. 일반 INSERT 쿼리는 레코드단위로 데이터를 저장하기 때문에 대량의 INSERT 쿼리가 동시에 유입될 경우, 시스템 성능이 저하될 수 있습니다. 그러나 IRIS에서 제공하는 벌크 데이터 로드 기능은 벌크 데이터 파일에 저장된 데이터를 한꺼번에 로드하므로, 동일한 양의 데이터를 IRIS에 저장하는 경우, 일반 INSERT 쿼리에 비하여 데이터 저장 속도를 최대 수십 배 향상시킬 수 있습니다. 벌크 데이터는 데이터 파일과 제어 파일의 쌍으로 구성 됩니다. 각 파일은 특정 규칙으로 생성이 되며 본 장에서는 벌크 데이터를 생성하는 방법에 대해서 설명 합니다. 벌크 데이터를 로드 하는 방법은 각 API마다 상이하므로 API문서를 참고 하시기 바랍니다.
4.1. 데이터 파일 생성하기
데이터 파일은 IRIS에 로드할 실제 데이터가 저장된 파일입니다. 아래는 사용자가 생성한 데이터 파일의 예입니다. 하나의 행, 즉 하나의 레코드는 ‘|’ 필드 구분자로 구분된 6개의 필드로 구성되어 있습니다.
SEOUL|GANGNAM01|SS0001|20161228080000|53|-65
SEOUL|GANGNAM01|SS0002|20161228080000|70|-70
SEOUL|GANGNAM01|YS0001|20161228080000|103|-64
SEOUL|GANGNAM01|SP0001|20161228080300|2|-30
SEOUL|GANGNAM01|CD0001|20161228080700|60|-50
...
데이터 파일 작성 시, 사용자가 준수하여야 할 규정은 다음과 같습니다.
데이터 파일의 각 레코드는 ‘\n’ 등 레코드 구분자(record separator)로 구분합니다.
각 레코드를 구성하는 필드는 ‘|’, ‘,’ 등의 필드 구분자(field separator)로 구분합니다.
동일한 데이터 파일 내에 저장된 데이터는 모두 동일한 partitionkey를 가집니다. 위의 예에서는 두 번째 컬럼인 ‘GANGNAM01’이 partitionkey를 나타냅니다.
동일한 데이터 파일 내에 저장된 데이터는 동일한 partitiondate 범위에 속합니다. 위의 예에서는 네 번째 컬럼인 날짜 값이 partitiondate를 나타냅니다.
4.2. 제어 파일
제어파일은 데이터 파일에 저장된 실제 데이터의 각 필드와 해당 테이블의 컬럼명에 대한 1:1 대응 관계를 나타냅니다. 즉, 데이터 파일에서 각 필드값이 테이블의 어떤 컬럼에 저장되는지를 정의하는 것입니다. 상기의 데이터 파일을 지정된 테이블에 로드하게 되면, 첫 번째 필드인 SEOUL은 CITY 컬럼에 저장되며, 두 번째 컬럼인 GANGNAM01은 DISTRICT 컬럼에 저장됩니다. 아래의 첫 번째 예는 레코드 구분자가 ‘\n’인 경우의 제어 파일을 작성한 예입니다. 즉, 각 컬럼명을 ‘\n’으로 구분합니다. 만일, 레코드 구분자가 ‘,’인 경우, 아래 2번째 예와 같이 각 컬럼명을 ‘,’로 구분하여 작성합니다.
- 레코드 구분자: ‘\n’인 경우
CITY DISTRICT BLOCK DATE PARAM01 PARAM02
- 레코드 구분자가 ‘,’인 경우
CITY,DISTRICT,BLOCK,DATE,PARAM01,PARAM02
위의 방법은 데이터를 그대로 로드하는 작업을 진행합니다. 만약 데이터 로드시 특정 함수를 적용하기를 원한다면 컬럼 이름 다음에 필드 구분자를 이용해 함수를 적어주면 됩니다. 이때 함수의 컬럼 명을 적어주는 부분에는 ? 를 적어주면 됩니다. ? 만 사용할 경우 어떠한 함수도 사용하지 않는 다는 것을 의미합니다.
- 레코드 구분자: \n, 필드 구분자: , 일 경우
CITY,? DISTRICT,? BLOCK,? DATE,? PARAM01,to_int(?, null) PARAM02,to_int(?, null)
SELECT시 사용하는 대부분의 함수를 지원하지만, SUM, MIN, MAX등 aggreage함수는 지원히지 않습니다. 또한 데이터 로드시에만 사용되는 함수가 존재합니다.
함수 |
설명 |
? |
데이터를 그대로 저장 합니다.
이 경우 모든 데이터는 문자로 취급 됩니다.
|
to_text(?, null) |
공백 문자가 들어올 경우 null로 변경 합니다.
|
to_int(?, null) |
컬럼을 정수형으로 변경합니다.
공백 문자가 들어올 경우 null로 변경을 합니다.
변경이 불가능한 데이터가 들어올 경우 로드에 실패합니다.
|
to_int(?, null, 0) |
컬럼을 정수형으로 변경합니다.
공백 문자가 들어올 경우 null로 변경을 합니다.
변경이 불가능한 데이터가 들어올 경우 0으로 저장 됩니다.
|
to_real(?, null) |
컬럼을 실수형으로 변경합니다.
공백 문자가 들어올 경우 null로 변경을 합니다.
변경이 불가능한 데이터가 들어올 경우 로드에 실패합니다.
|
to_real(?, null, 0.0) |
컬럼을 실수형으로 변경합니다.
공백 문자가 들어올 경우 null로 변경을 합니다.
변경이 불가능한 데이터가 들어올 경우 0.0으로 저장 됩니다.
|
4.3. iplus에서 벌크 데이터 로드하기
iplus에서 벌크 데이터를 로드하는 방법은 다음과 같습니다. 데이터를 IRIS에 insert하는 측에서는 각각의 레코드와 필드가 특정 구분자(separator) (예를 들어, 레코드 구분자: \n, 필드 구분자: |)로 구분된 대량의 레코드들을 데이터 파일에 저장한 후, partitionkey, partitiondate 및 파일 경로를 인자로 하여 iplus에서 제공하는 .load 명령어를 사용하여 해당 데이터를 한꺼번에 IRIS에 insert할 수 있습니다. 이때, .load 명령어를 실행하기 전에, 먼저 .record_sep 명령어와 .field_sep 명령어를 사용하여 레코드와 필드의 구분자를 지정합니다. 아래는 iplus에서 .load 명령어의 사용 방법을 보여줍니다.
iplus> .record_sep \n
iplus> .field_sep |
iplus> .load <t> <k> <p> <c> <d>
<t> : table name
<k> : partitionkey
<p> : partitiondate
<c> : control file path
<d> : data file path
4.4. API를 이용한 벌크 데이터 로드하기
API를 이용하여 벌크 데이터를 로드하는 방법은 API에 따라 상이하므로, 각 API문서를 참고하시기 바랍니다.