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 파일이 포함되어 있습니다.
메타스토어 쿼리
이 새 테이블은 metastore에서 만들어졌으므로 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;