주니어 데이터 엔지니어 우솨's 개발일지

데이터 엔지니어링 58일차 TIL 본문

데브코스

데이터 엔지니어링 58일차 TIL

우솨 2024. 6. 30. 10:02

학습 내용

Spark SQL이란?
- Spark SQL은 구조화된 데이터 처리를 위한 Spark모듈
- 데이터 프레임 작업을 SQL로 처리 가능
        - 데이터프레임에 테이블 이름 지정 후 sql함수 사용가능
                - 판다스에도 pandasql모듈의 sqldf 함수를 이용하는 동일한 패턴 존재
        - HQL(Hive Query Language)과 호환제공
                - Hive 테이블들을 읽고 쓸 수 있다.(Hive Metastore)

Spark SLQ 사용법
1. 데이터 프레임을 기반으로 테이블 뷰 생성
        - createOrReplaceTempView : spark Session이 살아있는 동안 존재
        - createOrReplaceGlobalTempView : Spark 드라이버가 살아있는 동안 존재
- Spark Session의 sql 함수로 SQL결과를 데이터 프레임으로 받는다.

Aggregation함수
- Group by : sum, min, max, avg, count 등
- Window : row_number, first_value, last_value 등
- Rank 함수

UDF(User Defined Function)
- 데이터프레임의 경우 .withColumn 함수와 같이 사용하는 것이 일반적
        - Spark SQL에서도 사용 가능하다.
- Aggregation용 UDAF(User Defined Aggregation Function)도 존재
        - Group by 에서 사용되는 Sum, AVG와 같은 함수를 만드는 것
        - PySpark에서 지원되지 않음. (Scalar 나 Java를 사용해야한다.)

중복확인 코드

spark.sql("""SELECT sessionid, COUNT(1) count
FROM user_session_channel
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1""").show()

 

=>Groupby 를 사용하여 갯수를 세었을때 1개가 넘는다면 중복되는 데이터가 존재한다.

Spark 데이터베이스와 테이블
- 카탈로그 : 테이블과 뷰에 관한 메타데이터 관리
        - 기본으로 메모리 기반 카탈로그 제공 - 세션이 끝나면 사라짐
        - Hive와 호환되는 카탈로그 제공 - Persistent
- 테이블 관리 방식
        - 테이블들은 데이터베이스라 부르는 폴더와 같은 구조로 관리(2단계)
- 메모리 기반 테이블/뷰 : 임시 테이블을 만들어 사용
- 스토리지 기반 테이블
        - 기본적으로 HDFS와 Parquet 포맷을 사용
        - Hive와 호환되는 메타스토어 사용
        - 두 종류의 테이블이 존재(Hive와 동일한 개념)
                - Managed Table : Spark이 실제 데이터와 메타데이터 모두 관리
                - Unmanaged(External) Table : Spark이 메타 데이터만 관리

Spark SQL - Managed Table사용
- 테이블 생성방법 두가지
        - dataframe.saveAsTable("테이블이름")
        - SQL문법 사용(CRETAE TABEL , CTAS)
- spark.sql.warehouse.dir가 가리키는 위치에 데이터가 저장된다.
        - PARQUET이 기본데이터 포맷
- 선호하는 테이블타입
- Spark테이블로 처리하는 것의 장점(파일로 저장하는 것과 비교시)
        - JDBC/ODBC등으로 Spark을 연결해서 접근 가능하다(태블로, 파워BI)

유닛테스트란?
- 코드 상의 특정기능(보통 메소드의 형태)를 테스트하기 위해 작성된 코드
- 정해진 입력을 주고 예상된 출력이 나오는지 형태로 테스트
- CI/CD를 사용하려면 전체 코드의 테스트 커버리지가 굉장히 중요해짐
- 각 언어별로 정해진 테스트 프레임웍을 사용하는 것이 일반적이다.
        - JUnit for Java
        - NUnit for .NET
        - unittest for python