를 사용하는 일반적인 데이터 로드 패턴 COPY INTO
파일 원본에서 Delta Lake로 데이터를 로드하는 데 사용하는 COPY INTO
일반적인 패턴을 알아봅니다.
COPY INTO
를 사용하기 위한 많은 옵션이 있습니다.
임시 credentials을 COPY INTO 및 이러한 패턴과 함께 사용할 수 있습니다.
모든 옵션에 대한 전체 참조는 COPY INTO 참조하세요.
COPY INTO
을 위한 tables 만들기
기존 Delta table를 COPY INTO
의 대상으로 지정해야 합니다.
CREATE TABLE IF NOT EXISTS my_table
[(col_1 col_1_type, col_2 col_2_type, ...)]
[COMMENT <table-description>]
[TBLPROPERTIES (<table-properties>)];
Databricks Runtime 11.3 LTS 이상에서 이러한 tables 대한 schema 설정하는 것은 schema 진화지원하는 형식의 경우 선택 사항입니다. 자세한 내용은
를 사용하여 JSON 데이터 로드 COPY INTO
다음 예제에서는 Azure Data Lake Storage Gen2(ADLS Gen2)의 5개 파일에서 Delta table으로 불리는 my_json_data
JSON 데이터를 불러옵니다.
COPY INTO
실행하려면 먼저 이 table 만들어야 합니다. 파일 중 하나에서 이미 로드된 데이터가 있으면 해당 파일에 대해 데이터가 다시 로드되지 않습니다.
COPY INTO my_json_data
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path'
FILEFORMAT = JSON
FILES = ('f1.json', 'f2.json', 'f3.json', 'f4.json', 'f5.json')
-- The second execution will not copy any data since the first command already loaded the data
COPY INTO my_json_data
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path'
FILEFORMAT = JSON
FILES = ('f1.json', 'f2.json', 'f3.json', 'f4.json', 'f5.json')
를 사용하여 Avro 데이터 로드 COPY INTO
다음 예제에서는 문의 일부로 추가 SQL 식을 사용하여 ADLS Gen2에서 SELECT
Avro 데이터를 로드합니다.
COPY INTO my_delta_table
FROM (SELECT to_date(dt) dt, event as measurement, quantity::double
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path')
FILEFORMAT = AVRO
를 사용하여 CSV 파일 로드 COPY INTO
다음 예제에서는 abfss://container@storageAccount.dfs.core.windows.net/base/path/folder1
아래의 Azure Data Lake Storage Gen2에서 CSV 파일을 Delta table로 로드합니다.
COPY INTO target_table
FROM (SELECT key, index, textData, 'constant_value'
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path')
FILEFORMAT = CSV
PATTERN = 'folder1/file_[a-g].csv'
FORMAT_OPTIONS('header' = 'true')
-- The example below loads CSV files without headers in ADLS Gen2 using COPY INTO.
-- By casting the data and renaming the columns, you can put the data in the schema you want
COPY INTO target_table
FROM (SELECT _c0::bigint key, _c1::int index, _c2 textData
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path')
FILEFORMAT = CSV
PATTERN = 'folder1/file_[a-g].csv'
Schema
COPY INTO
를 사용하여 추론 및 진화
이 섹션에서는 COPY INTO
사용하는 일반적인 schema 유추 및 진화 구성에 대한 예제를 제공합니다.
구문
COPY INTO my_table
FROM '/path/to/files'
FILEFORMAT = <format>
FORMAT_OPTIONS ('inferSchema' = 'true', `mergeSchema` = `true`)
COPY_OPTIONS ('mergeSchema' = 'true');
다음 FORMAT_OPTIONS
COPY INTO
입력 schema 자동으로 유추할 수 있습니다.
inferSchema
: 구문 분석된 레코드의 데이터 형식을 유추할지 또는 모든 columns을StringType
로 가정할지 여부입니다.mergeSchema
: 여러 소스 파일에서 schema을 유추하고 각 소스 파일의 schema를 병합할지 여부입니다.원본 파일의 schema이 동일한 경우, Databricks는
FORMAT_OPTIONS
(false
)에서mergeSchema
의 기본 설정을 사용할 것을 권장합니다.
다음 COPY_OPTIONS
은/는 COPY INTO
를 사용하여 대상 schema을 진화시키기 위해 사용할 수 있습니다.
mergeSchema
: 입력 schema에 따라, 대상 델타 table의 schema을 진화할지 여부입니다.입력 schema과 대상 schema이 동일한 경우에
COPY_OPTIONS
에서mergeSchema
가false
될 수 있습니다.
CSV schema 추론 및 발전시키기
다음 예제에서는 스키마 없는 Delta table를 만들고, my_pipe_data
라고 명명한 후 헤더가 있는 파이프로 구분된 CSV를 로드합니다.
mergeSchema
true
은 FORMAT_OPTIONS
입력 파일에 헤더 또는 구분 기호 차이가 있을 수 있기 때문입니다.
CREATE TABLE IF NOT EXISTS my_pipe_data;
COPY INTO my_pipe_data
FROM 'abfss://container@storageAccount.dfs.core.windows.net/base/path'
FILEFORMAT = CSV
FORMAT_OPTIONS ('mergeSchema' = 'true',
'delimiter' = '|',
'header' = 'true')
COPY_OPTIONS ('mergeSchema' = 'true');
데이터를 로드하는 동안 손상된 파일 무시
로드 중인 데이터가 일부 손상 문제로 인해 읽을 수 없는 경우 ignoreCorruptFiles
에서 true
를 FORMAT_OPTIONS
로 설정하여 해당 파일을 건너뛸 수 있습니다.
COPY INTO
명령의 결과는 num_skipped_corrupt_files
column손상으로 인해 건너뛴 파일 수를 반환합니다. 이 메트릭은 Delta table에서 DESCRIBE HISTORY
을 실행한 후 numSkippedCorruptFiles
아래의 operationMetrics
column에 표시됩니다.
손상된 파일은 COPY INTO
에서 추적하지 않으므로 손상이 수정되면 후속 실행에서 다시 로드할 수 있습니다.
COPY INTO
모드에서 VALIDATE
를 실행하면 어떤 파일이 손상되었는지 확인할 수 있습니다.
COPY INTO my_table
FROM '/path/to/files'
FILEFORMAT = <format>
[VALIDATE ALL]
FORMAT_OPTIONS ('ignoreCorruptFiles' = 'true')
참고 항목
ignoreCorruptFiles
는 Databricks Runtime 11.3 LTS 이상에서 사용할 수 있습니다.