Spark & Hadoop/Pyspark & SparkSQL

[Pyspark/SparkSQL] Hive-메타스토어 사용 (테이블 생성방법) (Managed Table, External Table)

YSY^ 2023. 10. 3. 18:53

카탈로그

  • 테이블과 뷰에 관한 메타 데이터 관리
  • 메타 데이터 : 데이터에 관한 구조화된 데이터, 다른 데이터를 설명해 주는 데이터이다.
  • 기본으로 메모리 기반 카탈로그 제공 - 세션이 끝나면 사라짐
  • Hive와 호환되는 카탈로그 제공 - Persistent

테이블 관리 방식

  • 테이블들은 데이터베이스라 부르는 폴더와 같은 구조로 관리 (2단계)

  • 메모리 기반 테이블/뷰
    • 임시 테이블
  • 스토리지 기반 테이블
    • 기본적으로 HDFS와 Parquet 포맷을 사용
    • Hive와 호환되는 메타스토어 사용
    • 두 종류의 테이블이 존재 (Hive와 동일한 개념)
      • Managed Table
        • Spark이 실제 데이터와 메타 데이터 모두 관리
      • Unmanaged (External) Table
        • Spark이 메타 데이터만 관리

Spark SQL  스토리지 기반 카탈로그 사용 방법

  • Hive와 호환되는 메타스토어 사용
  • SparkSession 생성시 enableHiveSupport() 호출
  • 기본으로 “default”라는 이름의 데이터베이스 생성

1. SparkSession 생성 및 데이터 호출

orders.csv
0.09MB

from pyspark.sql import SparkSession
spark = SparkSession \
 .builder \
 .appName("Python Spark Hive") \
 .enableHiveSupport() \
 .getOrCreate()
 
# Read in data and create a DataFrame
df = spark.read.csv("orders.csv", inferSchema=True, header=True, sep ='\t')
df.show(5)

2. 데이터베이스 생성

spark.sql("CREATE DATABASE IF NOT EXISTS TEST_DB")
spark.sql("USE TEST_DB") # Default Database는 위에서 만든 TEST_DB 라는 의미

3 .데이터 베이스 확인

  • 기본으로 “default”라는 이름의 데이터베이스와 위에서 만든 test_db를 확인할 수 있다.
spark.sql("SHOW DATABASES").show()

Spark SQL - Managed Table

  • 테이블 생성방법
    1. dataframe.saveAsTable("테이블이름") 
    2. SQL 문법 사용 (CREATE TABLE, CTAS)
  • spark.sql.warehouse.dir가 가리키는 위치에 데이터가 저장됨 
    • PARQUET이 기본 데이터 포맷
  • 가능하면 Managed Table을 사용하는 것이 좋음
  • Spark 테이블로 처리하는 것의 장점 (파일로 저장하는 것과 비교시)
    • JDBC/ODBC등으로 Spark을 연결해서 접근 가능 (태블로, 파워BI)

Managed Table 생성하는 방법

1-1. pyspark로 테이블 만드는 방법

df.write.saveAsTable("TEST_DB.orders", mode="overwrite") # pyspark

1-2. SparkSQL로 테이블 만드는 방법

df.createOrReplaceTempView("orders_view")

spark.sql("""
CREATE TABLE TEST_DB.orders
SELECT * FROM orders_view
"""
)

2. 테이블 확인

!ls -tl spark-warehouse/test_db.db/orders/

PARQUET이 DB에 생성된것을 확인할 수 있다.

3. 생성된 데이터 확인

spark.sql("SELECT * FROM TEST_DB.orders").show(5)  #sparkSQL로 확인
spark.table("TEST_DB.orders").show(5) #pyspark로 확인

4. spark 카탈로그에 있는 테이블 리스트 확인

spark.catalog.listTables()

tabletype은 MANAGED이고 isTemporary = False는 임시테이블이 아니라는 의미이다.

Spark SQL - External Table

  • 이미 HDFS에 존재하는 데이터에 스키마를 정의해서 사용
    • LOCATION이란 프로퍼티 사용 (location이 가르키는 데이터를 기반으로 테이블을 로딩)
  • 메타데이터만 카탈로그에 기록됨 
    • 데이터는 spark가 관리하지 않는 곳에 이미 존재
    • External Table은 삭제되어도 데이터는 그대로임
CREATE TABLE table_name ( column1 type1, column2 type2, column3 type3, … ) 
USING PARQUET LOCATION 'hdfs_path';

위 포스팅은 [파이썬으로 해보는 Spark 프로그래밍 with 프로그래머스] 강의를 듣고 정리한 내용입니다

728x90
반응형