델타 테이블 만들기

완료됨

Microsoft Fabric 레이크하우스에서 테이블을 만들 때 델타 테이블은 레이크하우스의 메타스토어에 정의되고 테이블의 데이터는 테이블의 기본 Parquet 파일에 저장됩니다.

Microsoft Fabric 환경에서 대부분의 대화형 도구를 사용하면 메타스토어의 테이블 정의를 기본 파일에 매핑하는 세부 정보가 추상화됩니다. 그러나 레이크하우스에서 Apache Spark를 사용하는 경우 델타 테이블의 생성 및 관리를 보다 잘 제어할 수 있습니다.

데이터 프레임에서 델타 테이블 만들기

Spark에서 델타 테이블을 만드는 가장 쉬운 방법 중 하나는 데이터 프레임을 델타 형식으로 저장하는 것입니다. 예를 들어 다음 PySpark 코드는 기존 파일의 데이터가 포함된 데이터 프레임을 로드한 다음, 해당 데이터 프레임을 델타 테이블로 저장합니다.

# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)

# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")

이 코드는 지정된 테이블 이름을 사용하여 테이블을 델타 형식으로 저장하도록 지정합니다. 테이블의 데이터는 테이블의 트랜잭션 로그를 포함하는 _delta_log 폴더와 함께 레이크하우스의 Tables 스토리지 영역에 있는 Parquet 파일(데이터 프레임에 로드한 원본 파일의 형식에 관계없이)에 저장됩니다. 테이블은 데이터 탐색기 창에 있는 레이크하우스의 Tables 폴더에 나열됩니다.

관리 테이블 대 외부 테이블

이전 예제에서 데이터 프레임은 관리형 테이블로 저장되었습니다. 즉, 메타스토어의 테이블 정의와 기본 데이터 파일은 모두 Fabric 레이크하우스에 대한 Spark 런타임에서 관리됩니다. 테이블을 삭제하면 레이크하우스의 Tables 스토리지 위치에서도 기본 파일이 삭제됩니다.

또한 메타스토어의 관계형 테이블 정의가 대체 파일 스토리지 위치에 매핑되는 외부 테이블로 테이블을 만들 수도 있습니다. 예를 들어 다음 코드는 레이크하우스의 Files 스토리지 위치에 있는 폴더에 데이터가 저장되는 외부 테이블을 만듭니다.

df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")

이 예제에서는 테이블 정의가 메타스토어에 만들어지므로 테이블이 레이크하우스의 테이블 사용자 인터페이스에 나열되지만 테이블의 Parquet 데이터 파일 및 JSON 로그 파일은 Files 스토리지 위치에 저장됩니다(그리고 Lakehouse 탐색기 창의 Files 노드에 표시됨).

다음과 같이 스토리지 위치에 대한 정규화된 경로를 지정할 수도 있습니다.

df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")

레이크하우스 메타스토어에서 외부 테이블을 삭제해도 연결된 데이터 파일은 삭제되지 않습니다.

테이블 메타데이터 만들기

데이터 프레임의 기존 데이터에서 테이블을 만드는 것이 일반적이지만 다른 방법으로 메타스토어에 데이터를 채우는 테이블 정의를 만들려는 시나리오가 있는 경우가 많습니다. 이 목표를 달성하는 방법에는 여러 가지가 있습니다.

DeltaTableBuilder API 사용

DeltaTableBuilder API를 사용하면 Spark 코드를 작성하여 사양에 따라 테이블을 만들 수 있습니다. 예를 들어 다음 코드는 지정된 이름과 열이 있는 테이블을 만듭니다.

from delta.tables import *

DeltaTable.create(spark) \
  .tableName("products") \
  .addColumn("Productid", "INT") \
  .addColumn("ProductName", "STRING") \
  .addColumn("Category", "STRING") \
  .addColumn("Price", "FLOAT") \
  .execute()

Spark SQL 사용

이 예제와 같이 Spark SQL CREATE TABLE 문을 사용하여 델타 테이블을 만들 수도 있습니다.

%%sql

CREATE TABLE salesorders
(
    Orderid INT NOT NULL,
    OrderDate TIMESTAMP NOT NULL,
    CustomerName STRING,
    SalesTotal FLOAT NOT NULL
)
USING DELTA

이전 예제에서는 관리형 테이블을 만듭니다. 다음과 같이 LOCATION 매개 변수를 지정하여 외부 테이블을 만들 수도 있습니다.

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'

외부 테이블을 만들 때 테이블의 스키마는 지정된 위치에 있는 데이터를 포함하는 Parquet 파일에 의해 결정됩니다. 이 방법은 델타 형식으로 이미 저장된 데이터를 참조하거나 델타 형식으로 데이터를 수집해야 하는 폴더를 기반으로 하는 테이블 정의를 만들려는 경우에 유용할 수 있습니다.

델타 형식으로 데이터 저장

지금까지 데이터 프레임을 델타 테이블로 저장하는 방법(메타스토어에 테이블 스키마 정의와 델타 형식의 데이터 파일 모두 만들기)과 테이블 정의를 만드는 방법(데이터 파일을 저장하지 않고 메타스토어에 테이블 스키마를 만드는 방법)을 살펴보았습니다. 세 번째 가능성은 메타스토어에 테이블 정의를 만들지 않고 델타 형식으로 데이터를 저장하는 것입니다. 이 접근 방식은 나중에 Delta Lake API를 사용하여 테이블 정의 또는 프로세스를 직접 “오버레이”할 수 있는 파일 형식으로 Spark에서 수행된 데이터 변환 결과를 유지하려는 경우에 유용할 수 있습니다.

예를 들어 PySpark 코드는 데이터 프레임을 델타 형식으로 새 폴더 위치에 저장합니다.

delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)

델타 파일을 저장한 후 지정한 경로 위치에는 데이터가 포함된 Parquet 파일과 데이터의 트랜잭션 로그가 포함된 _delta_log 폴더가 포함됩니다. Delta Lake API 또는 이후에 폴더에 만들어지는 외부 테이블을 통해 데이터를 수정한 내용은 트랜잭션 로그에 기록됩니다.

다음과 같이 덮어쓰기 모드를 사용하여 기존 폴더의 콘텐츠를 데이터 프레임의 데이터로 바꿀 수 있습니다.

new_df.write.format("delta").mode("overwrite").save(delta_path)

추가 모드를 사용하여 데이터 프레임의 행을 기존 폴더에 추가할 수도 있습니다.

new_rows_df.write.format("delta").mode("append").save(delta_path)

여기에 설명된 기술을 사용하여 레이크하우스의 Tables 위치에 데이터 프레임을 저장하는 경우 Microsoft Fabric은 자동 테이블 검색 기능을 사용하여 메타스토어에 해당 테이블 메타데이터를 만듭니다.