Database/Cassandra

[Cassandra] Import, Export csv file using CQL COPY command

bisi 2020. 5. 23. 13:14

카산드라에서는 Insert로 데이터를 넣는 방법 외에 csv 파일로 데이터를 한꺼번에 넣을수 있는 기능과

카산드라의 데이터를 csv 파일로 저장하는 기능을 지원한다.

 

이런 기능은 cql창에서 COPY 명령어를 사용하면 가능하다. 

# Import : Csv File -> Cassandra
COPY table_name [( column_list )] FROM 'file_name'[, 'file2_name', ...] | STDIN [WITH option = 'value' [AND ...]]

# Export : Cassandra -> Csv File
COPY table_name [( column_list )] TO 'file_name'[, 'file2_name', ...] | STDOUT [WITH option = 'value' [AND ...]]

 

COPY ... FROM  실습

 

1) 테이블 생성

create table emp
(
    emp_id    int primary key,
    emp_city  text,
    emp_name  text,
    emp_phone varint,
    emp_sal   varint
)

 

2) Import할 csv 파일 생성

emp_id|emp_city|emp_name|emp_phone|emp_sal
1|seoul|loga|01012345678|11575
2|seoul|logb|01012345678|11575
3|jeju|logc|01012345678|11575
  • 컬럼명이 첫 줄에, 나머지는 구분자로 구분되어 있어야한다.
  • 물론, 첫줄에 컬럼명을 넣지 않았을때 옵션값으로 처리할 순 있지만, 데이터의 빠른 확인을 위해 컬럼명 넣는 것을 추천한다.
  • 컬럼별로 데이터 타입(int, text, map, timestamp등)을 꼭 맞춰줘야 한다.
  • 테이블에 설정된 데이터 타입이 맞지 않으면 아래와 같은 에러가 발생한다. 
cqlsh:log> COPY emp(emp_id,emp_city,emp_name,emp_phone,emp_sal)
               ... FROM 'C:/Doople/Sample-Rawdata/test.csv' WITH DELIMITER='|';
Using 11 child processes

Starting copy of log.emp with columns [emp_id, emp_city, emp_name, emp_phone, emp_sal].
Failed to import 1 rows: ParseError - Failed to parse log003 : invalid literal for int() with base 10: 'log003',  given up without retries
Failed to import 1 rows: ParseError - Failed to parse log002 : invalid literal for int() with base 10: 'log002',  given up without retries
Failed to import 1 rows: ParseError - Failed to parse emp_id : invalid literal for int() with base 10: 'emp_id',  given up without retries
Failed to import 1 rows: ParseError - Failed to parse log001 : invalid literal for int() with base 10: 'log001',  given up without retries

Failed to process 4 rows; failed rows written to import_log_emp.err
.....

 

3) Cql창에서 COPY 명령어 실행

 

COPY emp(emp_id,emp_city,emp_name,emp_phone,emp_sal)
FROM 'C:/log/test.csv' WITH DELIMITER='|';
COPY {tablename}({cloumn_list})
FROM '{csv file path}' WITH DELIMITER='|';

 

COPY FROM/TO 옵션 값

 

4) 실행 결과

 

카산드라 공식 레퍼런스를 참고하면 다양한 옵션으로 데이터를 Import/Export가 가능하다. 

 

 

참고사이트 

https://docs.datastax.com/en/cql-oss/3.x/cql/cql_reference/cqlshCopy.html