본문 바로가기

Microsoft Fabric/Fabric 실습 2 - Spark

04. Spark SQL을 사용하여 데이터 작업

Dataframe API는 데이터 분석가가 SQL 식을 사용하여 데이터를 쿼리하고 조작할 수 있도록 하는 Spark SQL 라이브러리의 일부입니다.

 

Spark 카탈로그에서 데이터베이스 오브젝트 만들기

Spark 카탈로그는?

더보기

Apache Spark에서 "카탈로그"는 메타데이터 관리를 위한 중요한 구성 요소입니다. 이 카탈로그는 Spark SQL을 사용하여 데이터베이스, 테이블, 뷰, 함수 및 기타 메타데이터를 관리하는 데 사용됩니다. Spark 카탈로그의 주요 기능은 다음과 같습니다.

  1. 데이터베이스 관리: Spark 카탈로그를 사용하여 데이터베이스를 생성, 삭제, 변경 및 조회할 수 있습니다. 데이터베이스는 관련 테이블과 뷰의 논리적 컨테이너 역할을 합니다.
  2. 테이블과 뷰 관리: 카탈로그를 통해 테이블과 뷰를 생성, 삭제, 변경 및 조회할 수 있습니다. 테이블은 구조화된 데이터의 컬렉션을 나타내며, 뷰는 기존 테이블이나 뷰에서 파생된 가상의 테이블입니다.
  3. 함수 관리: 사용자 정의 함수(UDF) 및 내장 함수에 대한 정보를 조회하고 관리할 수 있습니다.
  4. 메타데이터 캐싱: Spark 카탈로그는 메타데이터의 캐싱을 지원하여, 데이터 소스의 메타데이터를 빠르게 조회할 수 있도록 합니다.
  5. 통합 메타데이터 관리: 여러 데이터 소스와의 통합을 지원하여, 다양한 저장소 시스템에 있는 데이터에 대한 메타데이터를 중앙에서 관리할 수 있습니다.
  6. Spark SQL과의 통합: 카탈로그는 Spark SQL과 밀접하게 통합되어 있어, SQL 쿼리를 사용하여 메타데이터를 관리하고 데이터를 쿼리할 수 있습니다.
  7. API 지원: Spark 카탈로그는 프로그래밍 방식으로 메타데이터를 관리할 수 있는 API를 제공합니다. 이를 통해 스크립트나 어플리케이션에서 메타데이터를 동적으로 관리할 수 있습니다.

Spark 카탈로그의 사용은 Spark SQL의 성능과 유연성을 크게 향상시킬 수 있으며, 대규모 데이터 처리 작업에서 메타데이터 관리의 복잡성을 줄여줍니다.

Spark 카탈로그에서 쿼리에 사용할 수 있도록 데이터 프레임의 데이터를 만드는 가장 간단한 방법은 임시 보기를 만드는 것입니다.

df.createOrReplaceTempView("products_view")

보기는 일시적이므로 현재 세션이 끝날 때 자동으로 삭제됩니다.

카탈로그에 유지되는 테이블을 만들어 Spark SQL을 사용하여 쿼리할 수 있는 데이터베이스를 정의할 수도 있습니다.

Microsoft Fabric에서 관리형 테이블의 데이터는 데이터 레이크에 표시된 테이블 스토리지 위치에 저장되고 Spark를 사용하여 만든 모든 테이블이 해당 위치에 나열됩니다.

 

spark.catalog.createTable 메서드를 사용하여 빈 테이블을 만들거나 

saveAsTable 메서드를 사용하여 데이터 프레임을 테이블로 저장할 수 있습니다.

관리형 테이블을 삭제하면 기본 데이터도 삭제됩니다.

# 새로운 테이블로 만들기
df = spark.read.load('Files/data/products.csv',
    format='csv',
    header=True
)
df.write.format("delta").saveAsTable("products2")

#빈테이블 만들기
spark.catalog.createTable("newtable")

# 새로운 테이블 조회하기
df = spark.sql("SELECT * FROM lakehouse_test.products2 LIMIT 1000")
display(df)

 

Spark SQL API를 사용하여 데이터 쿼리

어떤 언어로든 Spark SQL API를 사용하여 카탈로그의 데이터를 쿼리할 수 있습니다.

예를 들어 다음 PySpark 코드는 SQL 쿼리를 사용하여 products 테이블의 데이터를 데이터 프레임으로 반환합니다.

bikes_df = spark.sql("SELECT ProductKey, ProductName, ListPrice \
                      FROM products \
                      WHERE SubCategory IN ('Mountain Bikes', 'Road Bikes')")
display(bikes_df)

 

Notebook에서는 다음과 같이 %%sql 매직을 사용하여 카탈로그의 개체를 쿼리하는 SQL 코드를 실행할 수도 있습니다.

%%sql

SELECT SubCategory, COUNT(ProductKey) AS ProductCount
FROM products
GROUP BY SubCategory
ORDER BY SubCategory