SQL을 사용하여 데이터 변환
데이터 프레임 구조를 제공하는 SparkSQL 라이브러리를 사용하면 SQL을 데이터 작업 방식으로 사용할 수도 있습니다. 이 방법을 이용하면 SQL 쿼리를 사용하여 데이터 프레임의 데이터를 쿼리 및 변환하고 결과를 테이블로 유지할 수 있습니다.
참고
테이블은 파일에 대한 메타데이터 추상화입니다. 데이터는 관계형 테이블에 저장되지 않지만 테이블은 데이터 레이크의 파일에 대한 관계형 레이어를 제공합니다.
테이블 및 뷰 정의
Spark의 테이블 정의는 파일에 대한 관계형 추상화를 캡슐화하는 메타데이터 레이어인 메타스토어에 저장됩니다. 외부 테이블은 지정한 데이터 레이크 위치에 있는 파일을 참조하는 메타스토어의 관계형 테이블입니다. 테이블을 쿼리하거나 데이터 레이크에서 직접 파일을 읽어 데이터에 액세스할 수 있습니다.
참고
외부 테이블은 기본 파일에 “느슨하게 바인딩”되며 테이블을 삭제해도 파일은 삭제 되지 않습니다. 이렇게 하면 Spark를 사용하여 변환을 많이 해제한 다음, 데이터를 레이크에 유지할 수 있습니다. 이렇게 하면 테이블을 삭제할 수 있으며 다운스트림 프로세스는 이러한 최적화된 구조에 액세스할 수 있습니다. 메타스토어와 연결된 내부적으로 관리하는 스토리지 위치에 기본 데이터 파일이 저장되는 관리형 테이블을 정의할 수도 있습니다. 관리형 테이블은 파일에 “긴밀하게 바인딩”되며 관리형 테이블을 삭제하면 연결된 파일이 삭제됩니다.
다음 코드 예제에서는 데이터 프레임(CSV 파일에서 로드됨)을 외부 테이블 이름 sales_orders로 저장합니다. 파일은 데이터 레이크의 /sales_orders_table 폴더에 저장됩니다.
order_details.write.saveAsTable('sales_orders', format='parquet', mode='overwrite', path='/sales_orders_table')
SQL을 사용하여 데이터 쿼리 및 변환
테이블을 정의한 후 SQL을 사용하여 데이터를 쿼리하고 변환할 수 있습니다. 다음 코드는 Year 및 Month라는 두 개의 새 파생 열을 만든 다음, 새 파생 열이 추가된 transformed_orders라는 새 테이블을 만듭니다.
# Create derived columns
sql_transform = spark.sql("SELECT *, YEAR(OrderDate) AS Year, MONTH(OrderDate) AS Month FROM sales_orders")
# Save the results
sql_transform.write.partitionBy("Year","Month").saveAsTable('transformed_orders', format='parquet', mode='overwrite', path='/transformed_orders_table')
새 테이블의 데이터 파일은 Year=*NNNN* / Month=*N* 형식의 폴더 계층 구조에 저장되며, 각 폴더에는 연도 및 월별 해당 주문에 대한 parquet 파일이 포함되어 있습니다.
메타스토어 쿼리
이 새 테이블은 메타스토어에서 만들어졌기 때문에 SQL을 사용하여 첫 번째 줄의 %%sql 매직 키로 직접 쿼리하여 다음 스크립트와 같이 SQL 구문을 사용할 것임을 나타낼 수 있습니다.
%%sql
SELECT * FROM transformed_orders
WHERE Year = 2021
AND Month = 1
테이블 삭제
외부 테이블로 작업할 때 DROP
명령을 사용하여 데이터 레이크의 파일에 영향을 주지 않고 메타스토어에서 테이블 정의를 삭제할 수 있습니다. 이 방법을 사용하면 SQL을 사용하여 데이터를 변환한 후 메타스토어를 정리하는 동시에 변환된 데이터 파일을 다운스트림 데이터 분석 및 수집 프로세스에 사용할 수 있습니다.
%%sql
DROP TABLE transformed_orders;
DROP TABLE sales_orders;