13주차 수요일, 63일차 Today I Learned
빅데이터 처리 시스템, Hadoop Spark (3)
: Spark 프로그래밍 - SQL
✏️ 학습 내용
1. Spark SQL
구조화된 데이터를 다루는 한 SQL은 데이터 규모와 상관없이 쓰인다. 모든 대용량 데이터 웨어하우스는 SQL 기반이며, Spark도 예외는 아니다. Spark SQL이란 구조화된 데이터 처리를 위한 Spark 모듈로, 데이터 프레임 작업을 SQL로 처리 가능하다. 데이터프레임에 테이블 이름 지정 후 SQL 함수를 사용 가능하고, HQL (Hive Query Language)과 호환 제공되어 Hive 테이블들을 읽고 쓸 수 있다. SQL로 가능한 작업이라면 DataFrame을 사용할 이유는 없다 (동시에 사용할 수 있음).
- Familiarity/Readability : 가독성이 더 좋고, 더 많은 사람들이 사용 가능하다.
- Optimization : Spark SQL 엔진이 최적화하기 더 좋다.
- Interoperability/Data Management : SQL이 포팅도 쉽고 접근권한 체크도 쉽다.
SparkSQL을 사용하려면, (1) 데이터 프레임을 기반으로 테이블 뷰를 생성하고, (2) Spark Session의 SQL 함수로 SQL 결과를 데이터 프레임으로 받으면 된다.
- createOrReplaceTempView: spark Session이 살아있는 동안 존재
- createOrReplaceGlobalTempView: Spark 드라이버가 살아있는 동안 존재
namegender_df.createOrReplaceTempView("namegender")
namegender_group_df = spark.sql("""
SELECT gender, count(1) FROM namegender GROUP BY 1 """)
print(namegender_group_df.collect())
SparkSession을 사용하여 외부 데이터 베이스와 연결하려면 read 함수를 호출하여 결과가 데이터 프레임으로 리턴되게 한다.
df_user_session_channel = spark.read \
.format("jdbc") \
.option("driver", "com.amazon.redshift.jdbc42.Driver") \
.option("url", "jdbc:redshift://HOST:PORT/DB?user=ID&password=PASSWORD") \ .option("dbtable", "raw_data.user_session_channel") \
.load()
2. Aggregation, Join, UDF
Aggregation
- Group By - SUM, MIN, MAX, AVG, COUNT
- Window - ROW_NUMBER, FIRST_VALUE, LAST_VALUE
- Rank
Join
- Inner, Full, Left, Right, Cross, Self
최적화 관점에서 본 조인의 종류는 Shuffle Join, Broadcast Join이 있다. 셔플링은 최대한 없는 것이 좋다.
UDF (User Defined Function)
데이터프레임이나 SQL에서 적용할 수 있는 사용자 정의 함수로, 2가지 종류가 있다.
- Transfer 해주는 UDF
- UDAF
UDF 사용 방법 :
- 함수 구현 - 파이썬 람다 함수, 파이썬 (보통) 함수, 파이썬 판다스 함수
- 함수 등록
- 함수 사용
3. Hive 메타스토어
카탈로그란 테이블과 뷰에 관한 메타 데이터 관리이다. 세션이 사라지면 사라지는 임시 정보이므로, 디스크로 저장되어 Spark Session이 끝나도 유지되는 디스크 기반의 테이블이 필요해졌다. 따라서 Hive의 메타스토어를 Spark 테이블의 메타 스토어로 쓰기로 결정했고, 그러므로 Spark에는 2종류의 테이블 뷰/카탈로그가 존재한다.
- 인메모리 카탈로그 : 세션이 끝나면 사라짐
- Hive와 호환되는 메타스토어 카탈로그 (스토리지 기반 테이블) : Spark Session 생성 시 enableHiveSupport() 호출하여 사용
4. 유닛 테스트
유닛 테스트란 코드 상의 특정 기능 (보통 메소드의 형태)을 테스트하기 위해 작성된 코드이다. 보통 정해진 입력을 주고 예상된 출력이 나오는지 형태로 테스트한다. CI/CD를 사용하려면 전체 코드의 테스트 커버러지가 굉장히 중요해진다. 각 언어별로 정해진 테스트 프레임웍을 사용하는 것이 일반적이며, 네트워크나 리소스 없는 상황에서도 테스트가 가능하도록 작성하는 것을 선호한다.
💡 배운 점
- 데이터 분석에 SQL이 필수적이라는 것이 다시금 느꼈다.
- Spark에는 SparkSQL 모듈이 존재하고, 데이터 프레임을 SQL로 처리 가능하다는 것을 배웠다.
- UDF에 대해 배웠다.
- Hive 메타스토어에 대해 배웠다.
- 코드와 SQL 검증을 위한 유닛 테스트 작성의 필요성에 대해 배웠다.
📝 남아있는 의문과 개선점
- 실습 내용을 더 살펴보아야 한다.
- TDD에 대해서 알아보아야 한다.
☁️ 소감
SQL이 데이터 직군에서는 가히 필수적이라는 것을 다시 한 번 느끼게 되었다. 진작에 SQL을 공부하기를 잘 한 것 같다고 생각했다. 좀 더 SQL을 활용할 수 있도록 이론 공부와 실습을 꾸준히 해야겠다.
'Data Engineering > grepp 데브코스 : TIL' 카테고리의 다른 글
[TIL_2024.01.19] 빅데이터 처리 시스템, Hadoop Spark (5) : SparkML, 클라우드 기반의 Spark 클러스터 (0) | 2024.02.15 |
---|---|
[TIL_2024.01.18] 빅데이터 처리 시스템, Hadoop Spark (4) : Spark 내부 동작 이해하기 (0) | 2024.02.15 |
[TIL_2024.01.16] 빅데이터 처리 시스템, Hadoop Spark (2) : Spark 프로그래밍 - DataFrame (0) | 2024.02.15 |
[TIL_2024.01.15] 빅데이터 처리 시스템, Hadoop Spark (1) : 빅데이터 처리와 Spark 소개 (1) | 2024.02.15 |
[TIL_2024.01.05] dot & 데이터 카탈로그 (1) | 2024.01.05 |