[스터디] 스파크 완벽 가이드 11일차

Kristopher·2022년 1월 28일
0

Spark 스터디

목록 보기
11/16

Chapter 11 Dataset

Dataset이란?

Dataset은 구조적 API의 기본 데이터 타입이다. 앞서 살펴본 DataFrame은 Row타입의 Dataset이다. Dataset은 JVM을 사용하는 언어인 스칼라와 자바에서만 사용할 수 있다. 그렇다면 Dataset을 사용해야하는 이유는 무엇일까? 거기에는 크게 두가지 이유가 있다.

  • DataFrame 기능만으로는 수행할 연산을 표현할 수 없는 경우
  • 성능 저하를 감수하더라도 타입 안정성을 가진 데이터 타입을 사용하고 싶은 경우

복잡한 비지니스 로직을 설계해야하여 SQL이나 DataFrame 대신 단일 함수로 인코딩 해야하는 경우에는 Dataset을 이용하는 것이 더 효과적이다. 또한 데이터 타입이 유효하지 않은 연산은 런타입이 아닌 컴파일 에러가 발생하기도 하므로 Dataset을 사용하여 방어적으로 코드를 작성하는 것이 바람직 할 때도 있다.

Dataset의 생성

Dataset은 어떤 언어로 생성하느냐에 따라 방법이 다르다. Dataset을 생성하는 것은 수동 작업이므로 정의할 스키마를 미리 알고 있어야 한다.

자바 : Encoders 사용

import org.apache.spark.sql.Encoders;

...

Dataset<Flight> flights = spark.read
	.parquet("...")
    .as(Encoders.bean(Flight.class));

스칼라 : case class 사용

case class Flight ( ...)

val flightsDF = spark.read
	.parquet(...)
val flights = flightsDF.as[Flight]

Dataset의 트랜스포메이션은 DataFrame과 동일하다. DataFrame의 모든 트랜스포메이션은 Dataset에서 사용할 수 있다.

조인과 그룹화/집계

DataFrame과 마찬가지로 Dataset 역시 조인이 적용되지만, joinWith처럼 더 정교한 메서드를 제공한다. joinWith는 co-group과 유사하며 Dataset 안쪽의 두 개의 중첩된 Dataset으로 구성된다. 각 컬럼이 Dataset이기에 Dataset객체를 컬럼처럼 다룰 수 있다. 따라서 조인 수행시 더 많은 정보를 유지하고 정교하게 데이터를 다룰 수 있다.

Dataset역시 groupBy, rollup, cube메서드를 사용하여 집계를 낼 수 있는데, DataFrame을 반환하기에 데이터 타입 정보를 읽게 된다는 단점이 있다. 이 경우 groupByKey 메서드 등을 이용하여 이를 해결할 수 있다. 하지만 groupByKey 메서드는 groupBy에 비해 더 비용이 많이 들기 때문에 세밀한 처리가 필요한 경우에만 사용해야 한다.

Reference

스파크 완벽 가이드
아파치 스파크

profile
개발자 지망생입니다.

0개의 댓글