Spark 데이터 구조
- RDD, DataFrame, Dataset (Immutable Distributed Data)
- RDD가 가장 밑바닥에 있고, 그 위해 DataFrame과 Dataset가 있음
- RDD는 할 수 있는 것은 많지만, 프로그래밍 생산성이 떨어짐.
- python을 쓴다면 Dataframe, java/scaler로 한다면 Dataset을 씀
- 2016년에 DataFrame과 Dataset은 하나의 API로 통합됨
- 모두 파티션으로 나뉘어 Spark에서 처리됨
- DataFrame Code나 Sparksql을 효율적인 자바 바이트 코드(Java bytecode) 로 만들어주는 과정
- Cody Analysis : 코드 분석하여 어떤 테이블과, 컬럼을 쓰는지 결정하고, 사용자가 없는 테이블과 컬럼을 쓰면 에러를 냄
- Logical Optimization : 코드를 실행할 수 있는 여러 방안을 만들어내고 Catalyst Optimizer라고 하는 비용을 계산하는 과정을 거침. Standard Sql 최적화 방식을 사용
- Physical Planning : 비용이 가장 싼 방식을 골라, RDD Operation 룰로 코드를 만듬
- Code Generation : RDD Operation 코드를 자바 바이트 코드 로 바꿈
CF) 자바 바이트 코드(Java bytecode)
- 자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미함
- 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고도 불림.
- 자바 바이트 코드는 자바 가상 머신(JVM)만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있음.
RDD (Resilient Distributed Dataset)
- 로우레벨 데이터로 클러스터내의 서버에 분산된 데이터를 지칭
- 레코드별로 존재하지만 스키마가 존재하지 않음
- 구조화된 데이터나 비구조화된 데이터 모두 지원
- 변경이 불가능한 분산 저장된 데이터
- RDD는 다수의 파티션으로 구성
- 로우레벨의 함수형 변환 지원 (map, filter, flatMap 등등)
- 일반 파이썬 데이터는 parallelize 함수로 RDD로 변환
- 반대는 collect로 파이썬 데이터로 변환가능
# Rdd 코드 예시
py_list = [
(1, 2, 3, 'a b c'),
(4, 5, 6, 'd e f'),
(7, 8, 9, 'g h i')
]
rdd = sc.parallelize(py_list)
…
print(rdd.collect())
DataFrame과 Dataset
- 변경이 불가한 분산 저장된 데이터
- RDD위에 만들어지는 RDD와는 달리 필드 정보를 갖고 있음 (테이블)
- 즉, RDD와는 다르게 관계형 데이터베이스 테이블처럼 컬럼으로 나눠 저장
- Dataset은 타입 정보가 존재하며 컴파일 언어에서 사용가능
- 컴파일 언어: Scala/Java에서 사용가능
- PySpark에서는 DataFrame을 사용
- 판다스의 데이터 프레임 혹은 관계형 데이터베이스의 테이블과 거의 흡사
- 다양한 데이터소스 지원: HDFS, Hive, 외부 데이터베이스, RDD 등등
- 스칼라, 자바, 파이썬과 같은 언어에서 지원
정리
RDD | DataFrame | Dataset | |
정의 | Distributed collection of records (structured & unstructured) |
RDD organized into named column | Extention of dataframe |
도입된 버전 | 1.0 | 1.3 | 1.6 |
컴파일타임 타입 | X | X | O |
사용하기쉬운 API | X | O | O |
SparkSQL 기반 | X | O | O |
Catalyst Optimizer | X | O | O |
위 포스팅은 [파이썬으로 해보는 Spark 프로그래밍 with 프로그래머스] 강의를 듣고 정리한 내용입니다
728x90
반응형