[Apache Spark] Dataset

연수·2021년 11월 30일
0

spark

목록 보기
11/26

Dataset은 구조적 API의 기본 데이터 타입이다. Dataset은 자바 가상 머신을 사용하는 언어인 스칼라와 자바에서만 사용할 수 있다. Dataset을 사용해 데이터셋의 각 로우를 구성하는 객체를 정의한다.

  • DataFrame은 Row 타입의 Dataset을 의미한다.

도메인 별 특정 객체를 효과적으로 지원하기 위해 '인코더'라 부르는 특수 개념이 필요하다. 인코더는 도메인 별 특정 객체 T를 스파크의 내부 데이터 타입으로 매핑하는 시스템을 의미한다.

DataFrame이나 '표준' 구조적 API를 사용한다면 Row 타입을 직렬화된 바이너리 구조로 변환한다. 도메인에 특화된 객체를 만들어 사용하려면 스칼라의 케이스 클래스나 자바의 자바빈 형태로 사용자 정의 데이터타입을 정의해야 한다. 스파크에서는 Row 타입 대신 사용자가 정의한 데이터 타입을 분산 방식으로 다룰 수 있다.

Dataset API를 사용하면 스파크는 데이터셋에 접근할 때마다 Row 포맷이 아닌 사용자 정의 데이터 타입으로 변환한다. 이 변환 작업은 느리긴 하지만 사용자에게 더 많은 유연성을 제공할 수 있다.

 

🕜 Dataset을 사용해야 하는 이유

  1. DataFrame 기능만으로는 수행할 연산을 표현할 수 없는 경우
    • 예) 복잡한 비즈니스 로직을 SQL이나 DataFrame 대신 단일 함수로 인코딩해야 하는 경우
  2. 성능 저하를 감수하더라도 타입 안정성을 가진 데이터 타입을 사용하고 싶은 경우
    • 정확도와 방어적 코드를 가장 중요시하는 경우
  3. 단일 노드와 스파크 워크로드에서 전체 로우에 대한 다양한 트랜스포메이션을 재사용하려면 Dataset을 사용하는 것이 적합하다.
    • Dataset을 사용하는 장점 중 하나가 로컬과 분산 환경의 워크로드에서 재사용할 수 있다는 것
    • 케이스 클래스로 구현된 데이터 타입을 사용해 모든 데이터와 트랜스포메이션을 정의하면 재사용 가능
    • 올바른 클래스와 데이터 타입이 지정된 DataFrame을 로컬 디스크에 저장하면 다음 처리 과정에 사용할 수 있어 더 쉽게 데이터를 다룰 수 있다.
    • 예) 대량의 DataFrame 기반의 ETL 트랜스포메이션의 마지막 단계에서 사용 (드라이버로 데이터를 수집해 단일 노드의 라이브러리로 수집된 데이터를 처리)
    • 예) 트랜스포메이션의 첫 단계 (스파크 SQL에서 필터링 전에 로우 단위로 데이터를 파싱)

 

🍨 Dataset 생성

  • 자바: Encoders
    • 데이터 타입 클래스를 정의한 다음 DataFrame(Dataset 타입의)에 지정해 인코딩
  • 스칼라: 케이스 클래서
    • 스칼라 case class 구문을 사용해 데이터 타입을 정의
    • 케이스 클래스 → 정규 클래스
      • 불변성
      • 패턴 매칭으로 분해 가능
      • 참조값 대신 클래스 구조를 기반으로 비교
      • 사용하기 쉽고 다루기 편함

👊 액션

Dataset에 collect, take, count와 같은 액션을 적용할 수 있다.

또한 케이스 클래스에 실제로 접근할 때 어떠한 데이터 타입도 필요하지 않다. case class의 속성명을 지정하면 속성에 맞는 값과 데이터 타입 모두를 반환한다.

🍓 트랜스포메이션

Dataset을 사용하면 원형의 JVM 데이터 타입을 다루기 대문에 DataFrame보다 더 복잡하고 강력한 데이터 타입으로 트랜스포메이션을 사용할 수 있다.

  • 필터링
  • 매핑

🥟 조인

  • joinWith
    • co-group(RDD 용어)과 거의 유사하며 Dataset 안쪽에 다른 두 개의 중첩된 Dataset으로 구성된다.
    • 각 컬럼은 Dataset이므로 Dataset 객체를 컬럼처럼 다룰 수 있다.
    • 그러므로 조인 수행 시 더 많은 정보를 유지할 수 있으며 고급 맵이나 필터처럼 정교하게 데이터를 다룰 수 있다.

🦀 그룹화와 집계

  • groupByKey
    • 데이터 타입 정보를 유지할 수 있는 그룹화 방법
    • 특정 키를 기준으로 그룹화하고 형식화된 Dataset을 반환
    • 컬럼명 대신 함수를 파라미터로 사용해야 한다.
    • 파라미터로 함수를 사용함으로써 유연성을 얻을 수 있지만, 스파크는 함수와 JVM 데이터 타입을 최적화할 수 없으므로 트레이드오프가 발생한다.
    • 사용자가 정의한 인코딩으로 세밀한 처리가 필요하거나 필요한 경우에 사용

 


[출처] 스파크 완벽 가이드 (빌 체임버스, 마테이 자하리아 지음)

profile
DCDI

0개의 댓글