명령을 사용하여 CLONE Delta Lake 또는 Apache Iceberg 테이블을 복제하여 특정 버전에서 독립 복사본을 만듭니다. 딥 클론에서 데이터와 메타데이터를 모두 복사합니다. 단순 클론은 메타데이터만 복사하고 원본 데이터 파일을 참조하며, 딥 클론보다 컴퓨팅 및 스토리지가 적습니다.
Azure Databricks는 Parquet 및 Apache Iceberg 테이블 복제도 지원합니다. Parquet 및 Apache Iceberg 테이블을 Delta Lake에 증분 복제하기 및 관리형 Iceberg 테이블 복제하기를 참조하세요.
Unity 카탈로그에서 클론을 사용하는 방법에 대한 자세한 내용은 Unity 카탈로그 테이블의 단순 복제본을 참조 하세요.
참고 사항
Databricks는 OpenSharing을 사용하여 여러 조직에서 테이블에 대한 읽기 전용 액세스를 제공하는 것이 좋습니다. OpenSharing이란?을 참조하세요.
복제 유형
사용할 수 있는 클론 유형은 다음과 같습니다.
| 유형 | SQL 구문 | Description |
|---|---|---|
| 딥 클론 |
CLONE 또는 DEEP CLONE |
원본 테이블에서 스트림 메타데이터를 포함하여 복제 대상으로 데이터와 메타데이터를 모두 복사합니다. 원본 테이블에 쓰는 스트림은 중지한 후 클론 대상에서 중단된 지점부터 계속할 수 있습니다. |
| 부분 복제 | SHALLOW CLONE |
원본 테이블의 메타데이터만 복제 대상으로 복사합니다. 데이터 파일은 복사되지 않습니다. 얕은 클론을 만드는 것이 더 저렴합니다. 연산은 컴퓨팅 리소스와 스토리지 공간을 적게 사용하기 때문입니다. |
복제된 메타데이터에는 스키마, 분할 정보, 고정, null 허용 여부 및 TBLPROPERTIES. 딥 클론만의 경우 스트림 및 COPY INTO 메타데이터도 복제됩니다. 복제되지 않은 메타데이터는 테이블 설명, 사용자 정의 커밋 메타데이터, Delta Lake 테이블 기록 및 태그와 같은 Unity 카탈로그 속성 입니다.
참고 사항
스트리밍 테이블 및 구체화된 뷰는 CLONE을 지원하지 않습니다. 스트리밍 테이블 또는 구체화된 뷰는 깊거나 단순한 클론의 원본 또는 대상으로 사용할 수 없습니다.
제한 사항 및 제한 사항을 참조하세요.
클론 지표
CLONE는 작업이 완료되면 다음과 같은 메트릭을 단일 행 DataFrame으로 보고합니다.
-
source_table_size: 복제되는 원본 테이블의 크기(바이트)입니다. -
source_num_of_files: 원본 테이블의 파일 수. -
num_removed_files: 파일이 대체되는 경우, 현재 테이블에서 제거되는 파일의 수. -
num_copied_files: 원본에서 복사된 파일의 수(얕은 복제본의 경우 0). -
removed_files_size: 현재 테이블에서 제거되는 파일의 크기(바이트). -
copied_files_size: 테이블에 복사된 파일의 크기(바이트).
사용 권한
Azure Databricks 테이블 액세스 제어 및 클라우드 공급자에 대한 권한을 구성해야 합니다.
테이블 액세스 제어
깊은 복제와 얕은 복제 모두 다음과 같은 권한이 필요합니다.
- 원본 테이블에 대한
SELECT권한. -
CLONE을 사용하여 새 테이블을 만드는 경우, 테이블을 만드는 데이터베이스에 대한CREATE권한. -
CLONE을 사용하여 테이블을 대체하려면, 테이블에 대한MODIFY권한이 있어야 합니다.
클라우드 공급자 권한
딥 클론을 읽는 사용자에게는 클론 디렉터리에 대한 읽기 액세스 권한이 필요합니다. 작성기는 클론의 디렉터리에 대한 쓰기 액세스 권한이 필요합니다.
데이터 파일은 원본에 그대로 남아 있으므로, 얕은 클론을 읽는 사용자는 원본 테이블의 데이터 파일과 클론의 디렉터리 모두에 대한 읽기 권한이 필요합니다. 작성기는 클론의 디렉터리에 대한 쓰기 액세스 권한이 필요합니다.
예제
깊거나 얕은 클론 만들기
다음 코드 예제에서는 깊고 단순한 클론을 만드는 방법을 보여 줍니다.
SQL
딥 클론을 만듭니다.
CREATE TABLE target_table CLONE source_table;
기존 대상 바꾸기:
CREATE OR REPLACE TABLE target_table CLONE source_table;
딥 클론을 만들거나 대상이 이미 있는 경우 건너뜁니다.
CREATE TABLE IF NOT EXISTS target_table CLONE source_table;
최신 버전, 특정 버전 또는 특정 타임스탬프를 기준으로 얕은 클론을 생성합니다. 타임스탬프는 '2019-01-01'와 같은 날짜 문자열이거나 date_sub(current_date(), 1)와 같은 식일 수 있습니다.
CREATE TABLE target_table SHALLOW CLONE source_table;
CREATE TABLE target_table SHALLOW CLONE source_table VERSION AS OF version;
CREATE TABLE target_table SHALLOW CLONE source_table TIMESTAMP AS OF timestamp_expression;
Python
Python DeltaTable API는 Delta Lake와 관련이 있습니다.
최신 버전에서 원본 복제:
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False)
특정 버전에서 원본을 복제합니다.
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False)
특정 타임스탬프에서 원본을 복제합니다.
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)
Scala
Scala DeltaTable API는 Delta Lake와 관련이 있습니다.
최신 버전에서 원본 복제:
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false)
특정 버전에서 원본을 복제합니다.
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false)
특정 타임스탬프에서 원본을 복제합니다.
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false)
구문 세부 정보는 CREATE TABLE CLONE참조하세요.
동안 복사된 메타데이터 확인 CLONE
이 예제는 CLONE 작업 중 복사되는 메타데이터와 복사되지 않는 메타데이터, 특히 TBLPROPERTIES, Unity Catalog 태그 및 Delta Lake 기록을 보여 줍니다.
사용자 지정 속성과 기본 로그 보존 기간이 아닌 원본 테이블을 만든 다음, 데이터를 삽입하여 테이블 기록을 생성합니다.
CREATE OR REPLACE TABLE test_clone_source (id INT, val STRING)
TBLPROPERTIES ('my.custom.prop' = 'hello', 'delta.logRetentionDuration' = '12 days');
ALTER TABLE test_clone_source SET TAGS ('team' = 'data-eng', 'env' = 'prod');
INSERT INTO test_clone_source VALUES (1, 'a');
INSERT INTO test_clone_source VALUES (2, 'b');
깊은 복제와 얕은 복제를 생성합니다.
CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;
CREATE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;
참고 사항
Unity 카탈로그에서는 기존 단순 클론을 덮어쓰는 데 사용할 CREATE OR REPLACE 수 없습니다.
DROP TABLE 다음에 CREATE TABLE를 사용하거나 새 테이블 이름을 사용하세요.
제한 사항을 참조하세요.
TBLPROPERTIES 두 클론 모두에 복사되는지 확인합니다.
SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;
Unity 카탈로그 태그가 복제에 복사되지 않는지 확인합니다.
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_source';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_deep';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_shallow';
Delta Lake 기록이 복제에 복사되지 않는지 확인합니다.
DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;
정리:
DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;
데이터 보관
딥 클론을 사용하여 보관을 위해 특정 시점에 테이블의 상태를 유지할 수 있습니다. 딥 클론을 증분 방식으로 동기화하여 재해 복구를 위해 원본 테이블의 업데이트된 상태를 유지할 수 있습니다.
다음 명령을 한 달에 한 번 실행하여 보관 파일을 동기화합니다.
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
ML 모델 재현
기계 학습 사용 사례의 경우 ML 모델을 학습하는 데 사용된 테이블 버전을 보관할 수 있습니다. 이 보관된 데이터 세트를 사용하여 향후 모델을 테스트할 수 있습니다.
CLONE을 사용하여 데이터 세트 버전을 보관하려면 다음을 수행하세요:
예를 들어 버전 15에서 모델을 학습하는 데 사용되는 테이블의 버전을 보관하려면 다음을 수행합니다.
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
프로덕션 테이블에 대한 단기 실험
테이블을 손상시키지 않고 프로덕션 테이블에서 워크플로를 테스트하려면 단순 클론을 만듭니다. 단순 클론을 사용하면 모든 프로덕션 데이터를 참조하지만 프로덕션 워크로드에는 영향을 주지 않는 복제된 테이블에서 워크로드를 실행할 수 있습니다.
프로덕션 테이블의 단순 복제본을 만듭니다.
CREATE TABLE my_test SHALLOW CLONE my_prod_table;
참고 사항
Unity 카탈로그에서는 기존 단순 클론을 덮어쓰는 데 사용할 CREATE OR REPLACE 수 없습니다.
DROP TABLE 다음에 CREATE TABLE를 사용하거나 새 테이블 이름을 사용하세요.
제한 사항을 참조하세요.
복제본에서 업데이트 및 유효성 검사를 실행합니다.
UPDATE my_test WHERE user_id is null SET invalid=true;
준비가 되면 변경 사항을 다시 병합하세요. 병합은 클론의 업데이트 정보를 사용하여 가능한 경우 변경된 파일로만 정리합니다.
MERGE INTO my_prod_table
USING my_test
ON my_test.user_id <=> my_prod_table.user_id
WHEN MATCHED AND my_test.user_id is null THEN UPDATE *;
완료되면 클론을 삭제합니다.
DROP TABLE my_test;
테이블 속성 재정의
테이블 속성 재정의는 다음과 같은 경우에 유용합니다.
- 다른 사업부와 데이터를 공유할 때 테이블에 소유자 또는 사용자 정보를 주석으로 추가합니다.
- 보관에서 시간 이동이 필요한 경우 Delta Lake 테이블을 보관합니다. 보관 테이블에 대해 데이터 및 로그 보존 기간을 독립적으로 지정할 수 있습니다. 다음은 그 예입니다.
SQL
Delta Lake 테이블의 경우:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Iceberg 테이블의 경우:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)
Python
Python DeltaTable API는 Delta Lake 전용입니다.
dt = DeltaTable.forName(spark, "prod.my_table")
tblProps = {
"delta.logRetentionDuration": "3650 days",
"delta.deletedFileRetentionDuration": "3650 days"
}
dt.clone(target="archive_table", isShallow=False, replace=True, tblProps)
Scala
Scala DeltaTable API는 Delta Lake 전용입니다.
val dt = DeltaTable.forName(spark, "prod.my_table")
val tblProps = Map(
"delta.logRetentionDuration" -> "3650 days",
"delta.deletedFileRetentionDuration" -> "3650 days"
)
dt.clone(target="archive_table", isShallow = false, replace = true, properties = tblProps)
레거시 Hive 메타스토어의 클론 작업 동작 방식
중요합니다
Databricks Runtime 13.3 LTS 이상에서 Unity 카탈로그 관리 테이블은 단순 클론을 지원합니다. Unity 카탈로그 테이블에 대한 복제 동작은 다른 환경의 복제 동작과 다릅니다. Unity 카탈로그 테이블의 단순 복제본을 참조 하세요.
Hive 메타스토어에 등록된 Delta Lake 테이블 또는 테이블로 등록되지 않은 파일 컬렉션의 경우 복제에는 다음과 같은 동작이 있습니다.
- 깊거나 얕은 클론에 대한 변경 내용은 원본 테이블에 영향을 주지 않습니다.
- 얕은 복제본은 원본 디렉터리의 데이터 파일을 참조합니다. 원본 테이블에서
VACUUM를 실행하면 클라이언트는 더 이상 해당 데이터 파일들을 읽을 수 없으며, 이로 인해FileNotFoundException가 발생합니다. 복구하려면 얕은 클론에서 clonereplace을 실행하세요. 이 경우 원본 테이블에 의존하지 않는 딥 클론을 사용하는 것이 좋습니다. - 딥 클론은 원본 테이블에 의존하지 않지만 데이터와 메타데이터를 모두 복사하기 때문에 만드는 데 비용이 많이 듭니다.
-
replace복제를 해당 경로에 이미 테이블이 있는 대상에 수행하면, Delta 로그가 없는 경우 이를 생성합니다. 실행VACUUM하여 기존 데이터를 정리합니다. - 기존 Delta Lake 테이블의 경우 복제는 마지막 복제 이후 원본 테이블의 새 메타데이터 및 데이터만 포함하는 새 증분 커밋을 만듭니다.
- 테이블 복제는 (
Create Table As Select)와CTAS다릅니다. 복제본은 데이터 외에도 원본 테이블 메타데이터를 복사합니다. 분할, 형식, 고정, Null 허용 여부 또는 기타 설정을 지정할 필요가 없습니다. - 복제된 테이블은 원본 테이블에 대해 독립적인 기록을 갖습니다. 복제된 테이블의 시간 이동 쿼리는 원본 테이블과 동일한 입력에서 작동하지 않습니다.