본문 바로가기
개발/HADOOP_SPARK_ETC

Dataset

by 로그인시러 2017. 7. 25.
2.DataFrame

RDD와 마찬가지로 Immutable 하다
기존 RDB에서 테이블 형태로 이름이 있는 컬럼을 갖고 있다
큰 데이터셋을 만들고 쉽게 프로세싱하기위해 디자인되었다
SQL등을 이용해 데이터를 join하고 추출가능하다

3.Dataset

스파크2.0 부터는 DataFrame API 가 Dataset API와 합쳐진다.
기본적으로 RDD와 매우 유사한 특징을 갖는다.
가장 큰차이점이라면 Dataset은 type 과 스키마가 정의되어 있다는 것이다.
성능상으로는 RDD는 타입을 지정하든 안하든 클러스터간 데이터 사용에 JAVA serialization 을 사용한다. 이과정에서 객체의 시리얼라이즈 오버해도가 상당히 발생하고 이로인해 가비지 콜렉션에도 더 많은 오버헤드가 생기게 된다.

DataFrame 이나 Dataset은 스키마의 컨셉이 포함되어있는 데이터이다.  스파크가 기본적으로 JAVA 시리얼라이징을 하지않고 데이터의 스키마를 이해할 수 있도록 설계되어있다. 때문에 더 효율적으로 사용이 가능하며, 
스파크가 데이터를 off-heap storage에 binary 형태로 시리얼라이즈 하며 여러 트랜스포메이션을 off-heap 메모리상에서 직접 가능하도록 설계되어있다. (스파크에 내장된 엔코더는 off-heap data 와 de-serialize 없이 바로 인터렉트 가능한 바이트코드를 생성할 수 있다)
때문에 Dataset을 사용하면 성능면에서 더 좋은 결과를 얻을 수 있지만 Scala Product trait (Scala 의 case classes) 의 사용으로 제한되어 있다. 왜냐하면 위에서 말한것 처럼 스파크 엔진이 바이트코드를 생성해서 데이터에 엑세스 해야하기 때문이다.

뭔가 나도 잘 모르는 이야기를 막 쓴것 같은데 결국 스파크 2.0 에서는
RDD <<  Dataset
를 사용하면 되는것 같다. (DataFrame 은 없어졌으므로,, 단 호환을 위해 코드상 의미적으로 남아있는 것 같다)

예제) 


val rdd:RDD[PERSON] = ...

val rdd2: RDD[String] = rdd.map(person => person.lastName)


val rdd:Dataset[PERSON] = ...

val rdd2: Dataset[String] = ds.map(person => person.lastName)




출처 : https://m.blog.naver.com/PostView.nhn?blogId=tajogood&logNo=220783546981&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

댓글