카탈로그 테이블 만들기 및 쿼리

완료됨

지금까지 데이터 프레임에서 만들고 Delta Lake API를 통해 수정된 Delta Lake 테이블 인스턴스를 고려했습니다. Metastore에서 Delta Lake 테이블을 카탈로그 테이블로 정의하고 SQL을 사용하여 작업할 수도 있습니다.

외부 테이블과 관리 테이블

Delta Lake 테이블을 비롯한 Spark 카탈로그의 테이블은 관리 또는 외부 테이블일 수 있습니다. 이러한 테이블의 차이점을 이해하는 것이 중요합니다.

  • 관리 테이블은 지정된 위치 없이 정의되며 데이터 파일은 메타스토어가 사용하는 스토리지 내에 저장됩니다. 테이블을 삭제하면 카탈로그에서 메타데이터가 제거될 뿐만 아니라 데이터 파일이 저장된 폴더도 삭제됩니다.
  • 외부 테이블은 테이블의 데이터가 저장되는 사용자 지정 파일 위치에 대해 정의됩니다. 테이블에 대한 메타데이터는 Spark 카탈로그에 정의됩니다. 테이블을 삭제하면 카탈로그에서 메타데이터가 삭제되지만 데이터 파일에는 영향을 주지 않습니다.

카탈로그 테이블 만들기

여러 가지 방법으로 카탈로그 테이블을 만들 수 있습니다.

데이터 프레임에서 카탈로그 테이블 만들기

다음 예제와 같이 saveAsTable 작업으로 데이터 프레임을 작성하여 관리 테이블을 만들 수 있습니다.

# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")

## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")

SQL을 사용하여 카탈로그 테이블 만들기

CREATE TABLE SQL 문을 USING DELTA 절, 외부 테이블에 대한 선택적 LOCATION 매개 변수와 함께 사용하여 카탈로그 테이블을 만들 수도 있습니다. 다음 예제와 같이 SparkSQL API를 사용하여 문을 실행할 수 있습니다.

spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")

또는 Spark에서 네이티브 SQL 지원을 사용하여 문을 실행할 수 있습니다.

%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

지정한 이름의 테이블이 카탈로그에 이미 있는 경우 CREATE TABLE 문이 오류를 반환합니다. 이 동작을 완화하려면 CREATE TABLE IF NOT EXISTS 문 또는 CREATE OR REPLACE TABLE 문을 사용할 수 있습니다.

테이블 스키마 정의

지금까지 모든 예제에서는 테이블이 명시적 스키마 없이 만들어집니다. 데이터 프레임을 작성하여 만든 테이블의 경우 테이블 스키마가 데이터 프레임에서 상속됩니다. 외부 테이블을 만드는 경우 스키마가 현재 테이블 위치에 저장된 모든 파일에서 상속됩니다. 그러나 새 관리 테이블 또는 현재 빈 위치가 있는 외부 테이블을 만드는 경우에는 다음 예제와 같이 CREATE TABLE 문의 일부로 열 이름, 형식 및 Null 허용 여부를 지정하여 테이블 스키마를 정의합니다.

%sql

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

Delta Lake를 사용하는 경우 테이블 스키마가 적용됩니다. 모든 삽입 및 업데이트는 지정된 열 Null 허용 여부 및 데이터 형식을 준수해야 합니다.

DeltaTableBuilder API 사용

다음 예제와 같이 DeltaTableBuilder API(Delta Lake API의 일부)를 사용하여 카탈로그 테이블을 만들 수 있습니다.

from delta.tables import *

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

CREATE TABLE SQL 문과 마찬가지로 지정된 이름의 테이블이 이미 있는 경우 create 메서드가 오류를 반환합니다. createIfNotExists 또는 createOrReplace 메서드를 사용하여 이 동작을 완화할 수 있습니다.

카탈로그 테이블 사용

SQL 기반 관계형 데이터베이스의 테이블과 같은 카탈로그 테이블을 사용하고 표준 SQL 문을 사용하여 쿼리 및 조작할 수 있습니다. 예를 들어 다음 코드 예제에서는 SELECT 문을 사용하여 ManagedSalesOrders 테이블을 쿼리합니다.

%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Delta Lake 작업에 대한 자세한 내용은 Delta Lake 설명서에서 테이블 일괄 처리 읽기 및 쓰기를 참조하세요.