DuckDB, CSV에서 MySQL로의 ETL

DuckDB를 ETL 도구로 활용 : CSV 데이터 → MySQL DuckDB를 통한 CSV 데이터를 MySQL로 ETL 하는 방법 ETL이란? ETL이란 Extract, Transform, Load의 약자로, 데이터를 다양한 소스에서 추출하고 변환하고 적재하는 과정 ETL을 수행하기 위해서는 여러가지 툴을 사용할 수 있는데 그 중 하나 DuckDB 활용하는 안 DuckDB DuckDB는 분석 쿼리에 최적화된 임베디드 데이터베이스 DuckDB는 PostgreSQL과 호환되는 SQL 문법을 사용하고, 여러 DB와 연결하여 데이터를 효율적으로 가져와 로컬 DuckDB에서 데이터 처리 가능 Extensions : https://duckdb.org/docs/extensions/overview ETL 예제 DuckDB에서 CSV 파일을 읽어와 테이블 생성 MySQL Extension{:target="_blank"} CREATE TABLE csv_table AS SELECT * FROM read_csv_auto('your_csv_file'); DuckDB에서 MySQL에 연결합니다. 다음과 같은 명령어를 사용할 수 있습니다. INSTALL MySQL; LOAD MySQL; ATTACH 'host=localhost user=root port=0 database=etldb' AS mysqldb (TYPE mysql) USE mysqldb; DuckDB에서 MySQL로 데이터를 적재합니다. 다음과 같은 명령어를 사용할 수 있습니다. CREATE TABLE mysqldb.etldb.csvtbl AS SELECT * FROM csv_table; 참고 MySQL LOAD DATA{:target="_blank"} CSV to SQLite3{:target="_blank"}

January 25, 2024 · Byung Kyu KIM

CSV to SQLite3

CSV 파일을 SQLite3 Import 및 Query CSV to SQLite3 CSV 파일을 SQLite3로 Import 쿼리 CSV 샘플 데이터 확인 $ cat cities.csv "LatD", "LatM", "LatS", "NS", "LonD", "LonM", "LonS", "EW", "City", "State" 41, 5, 59, "N", 80, 39, 0, "W", "Youngstown", OH 42, 52, 48, "N", 97, 23, 23, "W", "Yankton", SD 46, 35, 59, "N", 120, 30, 36, "W", "Yakima", WA ... TIP: cat 대신 bat 사용하면 더 나은 뷰어를 제공 $ bat cities.csv CSV Import .mode csv : csv 모드로 전환 .import ./cities.csv ci : ./cities.csv 파일을 ci 테이블로 Import .import --skip 1 ./cities.csv ci : ./cities.csv 테이블이 존재 할때 header 제외 .import --csv ./cities.csv ci : ./cities.csv csv 모드 inline 옵션 # ci.db 생성 및 인터랙티브 모드 $ sqlite3 ci.db SQLite version 3.37.0 2021-12-09 01:34:53 Enter ".help" for usage hints. sqlite> .mode csv sqlite> .import ./cities.csv ci sqlite> .tables ci sqlite> select count(*) from ci; count(*) 129 sqlite> .mode list sqlite> .header on sqlite> select * from ci limit 10; LatD| "LatM"| "LatS"| "NS"| "LonD"| "LonM"| "LonS"| "EW"| "City"| "State" 41| 5| 59| "N"| 80| 39| 0| "W"| "Youngstown"| OH 42| 52| 48| "N"| 97| 23| 23| "W"| "Yankton"| SD 46| 35| 59| "N"| 120| 30| 36| "W"| "Yakima"| WA 42| 16| 12| "N"| 71| 48| 0| "W"| "Worcester"| MA 43| 37| 48| "N"| 89| 46| 11| "W"| "Wisconsin Dells"| WI 36| 5| 59| "N"| 80| 15| 0| "W"| "Winston-Salem"| NC 49| 52| 48| "N"| 97| 9| 0| "W"| "Winnipeg"| MB 39| 11| 23| "N"| 78| 9| 36| "W"| "Winchester"| VA 34| 14| 24| "N"| 77| 55| 11| "W"| "Wilmington"| NC 39| 45| 0| "N"| 75| 33| 0| "W"| "Wilmington"| DE Inline command $ sqlite3 /tmp/t.db ".import -csv ./cities.csv ci" "select * from ci" -header LatD| "LatM"| "LatS"| "NS"| "LonD"| "LonM"| "LonS"| "EW"| "City"| "State" 41| 5| 59| "N"| 80| 39| 0| "W"| "Youngstown"| OH 42| 52| 48| "N"| 97| 23| 23| "W"| "Yankton"| SD 46| 35| 59| "N"| 120| 30| 36| "W"| "Yakima"| WA 42| 16| 12| "N"| 71| 48| 0| "W"| "Worcester"| MA 43| 37| 48| "N"| 89| 46| 11| "W"| "Wisconsin Dells"| WI 36| 5| 59| "N"| 80| 15| 0| "W"| "Winston-Salem"| NC 49| 52| 48| "N"| 97| 9| 0| "W"| "Winnipeg"| MB 39| 11| 23| "N"| 78| 9| 36| "W"| "Winchester"| VA 34| 14| 24| "N"| 77| 55| 11| "W"| "Wilmington"| NC 39| 45| 0| "N"| 75| 33| 0| "W"| "Wilmington"| DE

August 9, 2022 · Byung Kyu KIM