스파크의 데이터프레임, 데이터셋, RDD 간 차이
저는 단지 어떤 것이 다른지 궁금할 뿐입니다.RDD
그리고.DataFrame
(Spark 2.0.0 DataFrame은 에 대한 단순한 유형 별칭입니다.) Apache Spark?
하나를 다른 하나로 바꿀 수 있습니까?
는 .
DataFrame
로부터 진화되었습니다.SchemaRDD
.
간의 변환.. 간의 Dataframe
그리고.RDD
절대 가능합니다.
다음은 몇 가지 샘플 코드 조각입니다.
df.rdd
이다 ㅇRDD[Row]
다음은 데이터 프레임을 만드는 몇 가지 옵션입니다.
1)
yourrddOffrow.toDF
으로 변환합니다.DataFrame
.2) 사용하기
createDataFrame
contextsql의val df = spark.createDataFrame(rddOfRow, schema)
여기서 스키마는 멋진 SO 포스트에서 설명한 아래 옵션 중 일부를 사용할 수 있습니다.
and reflection api case class및 scala reflection ap에서import org.apache.spark.sql.catalyst.ScalaReflection val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]
OR을 합니다.
Encoders
import org.apache.spark.sql.Encoders val mySchema = Encoders.product[MyCaseClass].schema
처럼 Schema 한 을 하여 에서 한 에서
StructType
그리고.StructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
실제로 Apache Spark API가 3개 있습니다.
RDD
API :
RDD
(Resilient Distributed Dataset) API 는 1.0 릴리스부터 Spark 있습니다 에
RDD
과은은환을다는합니다 등 많은 변환합니다.map
(),filter
(), 그리고reduce
데이터에 대한 계산을 수행하기 위한 ().이은운를다각다anh운이s은각wfseRDD
변환된 데이터를 나타냅니다.그러나 이 방법은 수행할 작업을 정의하는 것일 뿐이며 작업 방법이 호출될 때까지 변환이 수행되지 않습니다.행동 방법의 예는 다음과 같습니다.collect
) 및 ( )saveAsObjectFile
().
RDD 예:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
예:RDD로 속성별 필터링
rdd.filter(_.age > 21)
DataFrame
API
1 1.3 1.3 1 1
DataFrame
Spark의 성능과 확장성을 개선하고자 하는 Project Tungsten 이니셔티브의 일환으로 API.DataFrame
API는 스키마의 개념을 도입하여 데이터를 설명함으로써 Spark가 스키마를 관리하고 노드 간에만 데이터를 전달할 수 있도록 하여 Java 직렬화를 사용하는 것보다 훨씬 효율적인 방법으로 합니다.
DataFrame
는 API.RDD
스파크의 Catalyst optimizer가 실행할 수 있는 관계형 쿼리 계획을 구축하기 위한 API이기 때문에 API.에 익숙한 입니다.
SQL 스타일 예제:
df.filter("age > 21");
제한사항 : 코드가 이름별 데이터 속성을 가리키기 때문에 컴파일러가 오류를 잡아낼 수 없습니다.속성 이름이 올바르지 않으면 쿼리 계획이 생성된 런타임에만 오류가 탐지됩니다.
의 또 다른 DataFrame
API는 매우 스칼라 중심이며 자바를 지원하지만 지원은 제한적입니다.
를 들어 를 할 를 할 를 DataFrame
의에서RDD
의 Catalyst 할 수 도 Δ Δ Δ Catalyst Optimizer Δ Δ Δ DataFrame을 한다고 가정합니다.scala.Product
인터페이스.스칼라case class
이 인터페이스를 구현하기 때문에 상자를 계산합니다.
Dataset
API
Dataset
1Spark 1.6의 지향 을 목표로 하고 .RDD
API이지만 Catalyst 쿼리 옵티마이저의 성능 이점이 있습니다.인 오프헤프 스토리지 메커니즘을 합니다.DataFrame
API.는 ,
Dataset
API는 JVM 표현(오브젝트)과 스파크의 내부 바이너리 포맷 사이를 번역하는 인코더 개념을 가지고 있습니다.Spark는 전체 객체를 디시리얼화할 필요 없이 바이트 코드를 생성하여 오프헤프 데이터와 상호 작용하고 개별 속성에 대한 온디맨드 액세스를 제공한다는 점에서 매우 진보된 인코더를 내장하고 있습니다.Spark는 아직 맞춤형 인코더를 구현하기 위한 API를 제공하지 않지만, 향후 출시 예정입니다.로는.
Dataset
API는 Java와 Scala 둘 다 동일하게 잘 작동하도록 설계되었습니다.Java 개체를 사용할 때는 완전히 호환되는 것이 중요합니다.
Dataset
API SQL 스타일:
dataset.filter(_.age < 21);
카탈리스트 레벨 흐름..(Spark Summit에서 데이터 프레임 및 데이터셋 프레젠테이션 설명
더 읽어보면...databricks 기사 - A Tale of Three Apache Spark API: RDD vs DataFrame and Datasets
A DataFrame
구글에서 "DataFrame 정의"를 검색하면 잘 정의됩니다.
데이터 프레임은 각 열에 하나의 변수에 대한 측정값이 포함되어 있고 각 행에는 하나의 경우가 포함되어 있는 표 또는 2차원 배열과 같은 구조입니다.
비상대기상태DataFrame
은 표 형식으로 인해 추가 메타데이터를 사용하므로 스파크는 최종 쿼리에 대해 특정 최적화를 실행할 수 있습니다.
RDD
, 반면, 이는 데이터에 대해 수행할 수 있는 작업이 제한적이지 않기 때문에 최적화할 수 없는 데이터의 블랙박스에 가까운 탄력적 분산 데이터셋에 불과합니다.
DataFrame으로 할 수 있습니다.RDD
그것을 통하여rdd
method, a갈 a수다은서다nmod수갈,고n,에서RDD
에 이르기까지DataFrame
) (RDD표우인해를가해를e() )를 통해toDF
법
일반적으로 A를 사용하는 것이 좋습니다.DataFrame
쿼리 최적화 기능이 내장되어 있기 때문에 가능한 경우.
Apache Spark는 3가지 종류의 API를 제공합니다.
- RDD
- 데이터 프레임
- 데이터 집합
다음은 RDD, Dataframe, Dataset의 API 비교입니다.
RDD
Spark가 제공하는 주요 추상화는 RDD(Resilient Distributed Dataset)이며, 이는 클러스터의 노드 전체에 걸쳐 분할된 요소의 모음으로 병렬로 작업할 수 있습니다.
RDD 기능:-
분산 컬렉션:
RDD는 클러스터에서 병렬 분산 알고리즘을 사용하여 대규모 데이터 세트를 처리하고 생성하는 데 널리 채택되는 MapReduce 연산을 사용합니다.이를 통해 사용자는 높은 수준의 연산자 집합을 사용하여 작업 분산 및 내결함성에 대한 걱정 없이 병렬 연산을 작성할 수 있습니다.불변: 분할된 레코드 모음으로 구성된 RDD.파티션은 RDD에서 병렬성의 기본 단위이며, 각 파티션은 불변이며 기존 파티션에서 일부 변환을 통해 생성되는 하나의 논리적 데이터 분할입니다.불변성은 계산의 일관성을 달성하는 데 도움이 됩니다.
내결함성:RDD의 일부 파티션이 손실될 경우 여러 노드에 걸쳐 데이터 복제를 수행하는 대신 해당 파티션에서 변환을 리니지로 재생하여 동일한 계산을 수행할 수 있습니다.이러한 특성은 RDD의 가장 큰 장점으로 데이터 관리 및 복제에 많은 노력을 절약할 수 있으며 따라서 계산 속도가 빨라지기 때문입니다.
게으른 평가:결과를 바로 계산하지 않는다는 점에서 Spark의 모든 변환은 게으릅니다.대신 일부 기본 데이터 세트에 적용된 변환을 기억할 뿐입니다.변환은 동작이 드라이버 프로그램에 결과를 반환해야 할 때만 계산됩니다.
기능적 변환: RDD는 기존 데이터 세트에서 새로운 데이터 세트를 생성하는 변환과 데이터 세트에서 계산을 실행한 후 드라이버 프로그램에 값을 반환하는 동작의 두 가지 유형의 작업을 지원합니다.
데이터 처리 형식:
정형화된 데이터는 물론 비정형화된 데이터도 쉽고 효율적으로 처리할 수 있습니다.지원되는 프로그래밍 언어:
RDD API는 자바, 스칼라, 파이썬, R에서 이용 가능합니다.
RDD 제한사항:-
내장된 최적화 엔진 없음:RDD는 구조화된 데이터를 사용할 때 촉매 옵티마이저와 텅스텐 실행 엔진을 포함한 Spark의 고급 옵티마이저를 활용할 수 없습니다.개발자들은 각 RDD의 속성을 기반으로 최적화할 필요가 있습니다.
구조화된 데이터 처리:데이터프레임 및 데이터셋과 달리 RDD는 수집된 데이터의 스키마를 추론하지 않으며 사용자가 이를 지정해야 합니다.
데이터 프레임
스파크는 스파크 1.3 릴리즈에서 데이터 프레임을 선보였습니다.데이터프레임은 RDD가 안고 있던 주요 과제를 극복합니다.
DataFrame은 명명된 열로 구성된 데이터의 분산 모음입니다.관계형 데이터베이스의 테이블이나 R/Python Dataframe과 개념적으로 동등합니다.Dataframe과 함께 Spark는 고급 프로그래밍 기능을 활용하여 확장 가능한 쿼리 최적화기를 구축하는 Catalyst Optimizer도 도입했습니다.
데이터프레임 기능:-
Row Object의 분산 컬렉션: DataFrame은 명명된 열로 구성된 데이터의 분산 컬렉션입니다.관계형 데이터베이스의 테이블과 개념적으로 동등하지만 후드 아래에 더 풍부한 최적화 기능이 있습니다.
데이터 처리: 정형 및 비정형 데이터 형식(Avro, CSV, 탄성 검색, 카산드라)과 스토리지 시스템(HDFS, HIGE 테이블, MySQL 등)을 처리합니다.이 모든 다양한 데이터 소스를 읽고 쓸 수 있습니다.
촉매 옵티마이저를 사용한 최적화:SQL 쿼리와 DataFrame API 모두에 전원을 공급합니다.데이터 프레임은 4단계의 촉매 트리 변환 프레임워크를 사용합니다.
1.Analyzing a logical plan to resolve references 2.Logical plan optimization 3.Physical planning 4.Code generation to compile parts of the query to Java bytecode.
하이브 호환성:Spark SQL을 사용하면 기존 Hive 창고에서 수정되지 않은 Hive 쿼리를 실행할 수 있습니다.하이브 프론트엔드와 메타스토어를 재사용하고 기존 하이브 데이터, 쿼리, UDF와 완벽한 호환성을 제공합니다.
텅스텐:텅스텐은 메모리를 명시적으로 관리하고 수식 평가를 위해 동적으로 바이트 코드를 생성하는 물리적 실행 백엔드를 제공합니다.
지원되는 프로그래밍 언어:
데이터프레임 API는 자바, 스칼라, 파이썬, R로 제공됩니다.
데이터 프레임 제한:-
- 컴파일 타임 타입 안전성: 앞서 살펴본 바와 같이 Dataframe API는 컴파일 타임 안전성을 지원하지 않으므로 구조를 알 수 없을 때 데이터를 조작할 수 없습니다.다음 예제는 컴파일 시간 동안 작동합니다.그러나 이 코드를 실행할 때 런타임 예외가 발생합니다.
예:
case class Person(name : String , age : Int)
val dataframe = sqlContext.read.json("people.json")
dataframe.filter("salary > 10000").show
=> throws Exception : cannot resolve 'salary' given input age , name
여러 변환 및 집계 단계를 수행할 때는 특히 이 작업이 어렵습니다.
- 도메인 개체(손실된 도메인 개체)에서 작동할 수 없습니다.도메인 개체를 데이터 프레임으로 변환한 후에는 해당 개체에서 다시 생성할 수 없습니다.다음 예제에서 사용자를 생성하면person RDD에서 DF, person 클래스(RDD[Person])의 원래 RDD는 복구되지 않습니다.
예:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
데이터셋 API
데이터셋 API는 DataFrame의 확장으로, 안전한 객체 지향 프로그래밍 인터페이스를 제공합니다.관계형 스키마에 매핑된 강력한 형식의 불변 개체 모음입니다.
데이터셋의 핵심인 API는 인코더(Encoder)라는 새로운 개념으로 JVM 객체와 표 형태의 표현 간 변환을 담당합니다.표 형태의 표현은 스파크 내부 텅스텐 이진 형식을 사용하여 저장되므로 직렬화된 데이터와 향상된 메모리 사용률에 대한 작업이 가능합니다.Spark 1.6은 기본 유형(String, Integer, Long), Scala case 클래스 및 Java Beans를 포함한 다양한 유형의 인코더를 자동으로 생성할 수 있도록 지원합니다.
데이터셋 기능:-
RDD와 Dataframe의 최상의 기능을 제공합니다: RDD(기능적 프로그래밍, 안전형), DataFrame(관계형 모델, Query Optimization, Tungsten 실행, 정렬 및 셔플)
인코더:인코더를 사용하면 모든 JVM 개체를 데이터셋으로 쉽게 변환할 수 있으므로 사용자는 Dataframe과 달리 정형 데이터와 비정형 데이터를 모두 사용할 수 있습니다.
지원되는 프로그래밍 언어:데이터셋 API는 현재 스칼라와 자바에서만 사용 가능합니다.파이썬과 R은 현재 버전 1.6에서는 지원되지 않습니다.파이썬 지원은 버전 2.0으로 예정되어 있습니다.
유형 안전성: 데이터셋 API는 Dataframe에서 사용할 수 없었던 컴파일 시간 안전성을 제공합니다.아래 예제에서 데이터셋이 컴파일 람다 함수가 있는 도메인 개체에서 어떻게 작동할 수 있는지 확인할 수 있습니다.
예:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
// error : value salary is not a member of person
ds.rdd // returns RDD[Person]
- 상호 운용 가능: 데이터셋을 사용하면 보일러 플레이트 코드 없이 기존 RDD 및 데이터 프레임을 쉽게 데이터셋으로 변환할 수 있습니다.
데이터셋 API 제한:-
- 문자열에 대한 형식 캐스팅 필요:현재 데이터셋에서 데이터를 쿼리하려면 클래스의 필드를 문자열로 지정해야 합니다.데이터를 조회한 후에는 필요한 데이터 유형으로 열을 캐스트해야 합니다.반면 데이터셋에서 맵 연산을 사용하는 경우 Catalyst optimizer를 사용하지 않습니다.
예:
ds.select(col("name").as[String], $"age".as[Int]).collect()
Python 및 R에 대한 지원 없음: 릴리스 1.6에서 데이터셋은 Scala 및 Java만 지원합니다.Python 지원은 Spark 2.0에 도입될 예정입니다.
Datasets API는 기존 RDD 및 Dataframe API보다 더 나은 유형의 안전성과 기능적 프로그래밍으로 여러 장점을 제공합니다.API의 형식 주조 요구 사항이 문제가 될 경우, 요구되는 형식 안전성이 부족하고 코드가 취약해집니다.
모두(RDD, DataFrame, DataSet)를 한 사진에 담습니다.
RDD
RDD
는 병렬로 작동할 수 있는 요소의 고장에 대한 집합입니다.
DataFrame
DataFrame
는 명명된 열로 구성된 데이터 집합입니다.R/Python의 데이터 프레임 또는 관계형 데이터베이스의 테이블과 개념적으로 동등하지만 후드 아래에 더 풍부한 최적화 기능이 있습니다.
Dataset
Dataset
는 데이터의 분산 모음입니다.데이터셋은 Spark 1.6에 추가된 새로운 인터페이스로 Spark SQL의 최적화된 실행 엔진의 이점과 함께 RDD(강력한 타이핑, 강력한 람다 함수 사용 기능)의 이점을 제공합니다.
참고:
행 데이터 집합(
Dataset[Row]
Scala/Java에서는 DataFrame이라고도 합니다.
코드 스니펫으로 그들 모두를 비교해보니 좋네요.
Q: RDD를 DataFrame으로 변환하거나 그 반대로 변환할 수 있습니까?
네, 둘 다 가능합니다.
1. RDD
DataFrame
와 함께.toDF()
val rowsRdd: RDD[Row] = sc.parallelize(
Seq(
Row("first", 2.0, 7.0),
Row("second", 3.5, 2.5),
Row("third", 7.0, 5.9)
)
)
val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")
df.show()
+------+----+----+
| id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+
기타 방법:RDD 개체를 스파크에서 Dataframe으로 변환
2. DataFrame
/DataSet
RDD
와 함께.rdd()
법
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
왜냐하면 ㅇDataFrame
타이핑이 약하고 개발자들은 타이핑 시스템의 이점을 얻지 못하고 있습니다.예를 들어 SQL에서 무언가를 읽고 이에 대한 Aggregation을 실행하고자 한다고 가정해 보겠습니다.
val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")
people.filter("age > 30")
.join(department, people("deptId") === department("id"))
.groupBy(department("name"), "gender")
.agg(avg(people("salary")), max(people("age")))
이 ㅇㅇ라고 people("deptId")
, 당신은 돌아올 수 없습니다.Int
, 아니면.Long
, 당신은 다시 돌아오게 됩니다.Column
수술해야 할 대상입니다.Scala와 같은 풍부한 유형의 시스템을 사용하는 언어에서는 모든 유형 안전성을 잃게 되므로 컴파일 시 발견할 수 있는 런타임 오류의 수가 증가합니다.
로.DataSet[T]
◦ 같은 :다음과 같은 경우:
val people: People = val people = sqlContext.read.parquet("...").as[People]
당신은 정말로 다시 돌아오는군요.People
에,체deptId
는 실제 적분 형식이며 열 형식이 아니므로 형식 시스템의 이점을 활용합니다.
되어 Spark 2.0 으로 DataFrame 입니다 DataSet API DataFrame
에 대한 유형 별칭이 될 것입니다.DataSet[Row]
.
간단히 ㅇRDD
성분이지만이지만,DataFrame
1는 spark 1.3에에 도입된 입니다.
RDD
된 이라는 데이터 파티션 모음RDD
이 .RDD
다음과 같은 몇 가지 속성을 따라야 합니다.
- 불변,
- 내결함성,
- 배포됨,
- 더.
여기서RDD
구조화되었거나 비구조화되었습니다.
데이터 프레임
DataFrame
및 RSla,바,썬,및 에,서 API로 제공되는 API입니다.Structured 및 semistructured 데이터 유형을 모두 처리할 수 있습니다.하기를 정의하는 DataFrame
, 이름난 열들로 조직된 분산된 데이터의 집합.DataFrame
. 할 를 쉽게 할 수 있습니다.RDDs
DataFrame
. JSON , data, 를 data, parquet data, HiveQL data 를 할 수 .DataFrame
.
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
서 Sample_ _DF는 DF 과 합니다 는 합니다 로 합니다.DataFrame
.sampleRDD
data) (raw data) 라고 합니다.RDD
.
대부분의 정답은 여기에 한 가지 점만 추가하고자 합니다.
Spark 2.0에서는 두 API(DataFrame + DataSet)가 하나의 API로 통합됩니다.
"데이터프레임 및 데이터셋 통합:Scala와 Java에서는 DataFrame과 Dataset이 통합되었습니다. 즉, DataFrame은 행의 Dataset에 대한 유형 별칭일 뿐입니다.Python과 R에서는 타입 안전성이 부족하기 때문에 DataFrame이 주요 프로그래밍 인터페이스입니다."
데이터셋은 RDD와 유사하지만 자바 직렬화나 Kryo 대신에 네트워크를 통해 처리하거나 전송하기 위해 객체를 직렬화하기 위해 전문 인코더를 사용합니다.
Spark SQL은 기존 RDD를 데이터셋으로 변환하는 두 가지 방법을 지원합니다.첫 번째 방법은 reflection을 사용하여 특정 유형의 객체를 포함하는 RDD의 스키마를 추론합니다.이러한 reflection 기반 접근 방식은 Spark 애플리케이션을 작성하는 동안 스키마를 이미 알고 있을 때 더욱 간결한 코드를 제공하고 잘 작동합니다.
데이터셋을 만드는 두 번째 방법은 스키마를 구성한 다음 기존 RDD에 적용할 수 있는 프로그램 인터페이스를 통해서입니다.이 방법은 좀 더 상세하지만, 실행 시까지 열과 유형을 알 수 없을 때 데이터셋을 구성할 수 있습니다.
여기서 데이터 프레임 대화 답변의 RDD를 확인할 수 있습니다.
rdd 개체를 스파크에서 데이터 프레임으로 변환하는 방법
DataFrame은 RDBMS의 테이블과 동일하며 RDD의 "Native" 분산 컬렉션과 유사한 방식으로 조작할 수도 있습니다.RDD와 달리 데이터프레임은 스키마를 추적하고 보다 최적화된 실행을 가능하게 하는 다양한 관계형 작업을 지원합니다.각 DataFrame 개체는 논리적 계획을 나타내지만 "게으른" 특성 때문에 사용자가 특정 "출력 작업"을 호출할 때까지 실행되지 않습니다.
RDD 대 DataFrame, 사용 관점에서의 통찰력은 거의 없습니다.
- RDD는 구조화되지 않은, 반구조화된, 구조화된 데이터 등 거의 모든 종류의 데이터를 처리할 수 있는 유연성을 제공하기 때문에 놀랍습니다.데이터 프레임에 데이터를 넣을 준비가 되지 않은 경우가 많기 때문에(심지어 JSON) RDD를 사용하여 데이터 프레임에 데이터를 넣을 수 있도록 데이터에 대한 사전 처리를 수행할 수 있습니다.RDD는 Spark의 핵심 데이터 추상화입니다.
- RDD에서 가능한 모든 변환이 DataFrame에서 가능한 것은 아닙니다. 예를 들어 감산()은 RDD 대 DataFrame에 대한 변환입니다.
- DataFrame은 관계형 테이블과 같기 때문에 set/relational 이론 변환을 사용할 때 엄격한 규칙을 따릅니다. 예를 들어 두 데이터 프레임을 결합하려는 경우 두 dfs 모두 동일한 수의 열과 관련된 열 데이터 유형을 가져야 합니다.열 이름은 다를 수 있습니다.이러한 규칙은 RDD에는 적용되지 않습니다.여기 이 사실들을 설명하는 좋은 튜토리얼이 있습니다.
- 다른 사람들이 이미 자세히 설명했듯이 데이터 프레임을 사용할 경우 성능 향상이 있습니다.
- 데이터 프레임을 사용하면 RDD로 프로그래밍할 때처럼 임의의 기능을 전달할 필요가 없습니다.
- 데이터 프레임이 Spark 에코시스템의 SparkSQL 영역에 있으므로 SQLContext/HiveContext를 프로그래밍해야 하지만 RDD의 경우 SparkContext/JavaSparkContext만 SparkCore 라이브러리에 있으면 됩니다.
- RDD에 대한 스키마를 정의할 수 있는 경우 RDD에서 df를 생성할 수 있습니다.
- df를 rdd로, rdd를 df로 변환할 수도 있습니다.
도움이 됐으면 좋겠네요!
Dataframe은 각각 레코드를 나타내는 행 객체의 RDD입니다.데이터프레임은 행의 스키마(즉, 데이터 필드)도 알고 있습니다.데이터 프레임은 일반 RDD처럼 보이지만 내부적으로는 스키마를 활용하여 보다 효율적인 방식으로 데이터를 저장합니다.또한 RDD에서 사용할 수 없는 새로운 작업(예: SQL 쿼리 실행 기능)을 제공합니다.데이터 프레임은 외부 데이터 소스, 쿼리 결과 또는 일반 RDD에서 생성할 수 있습니다.
참고문헌: Zaharia M., et al.Learning Spark (오레일리, 2015)
a. RDD (Spark1.0) —> 데이터프레임 (Spark1.3) —> 데이터셋 (Spark1.6)
b. RDD를 사용하면 아래의 처리에서 스파크가 할 수 있는 최적화를 제한하는 방법을 결정할 수 있습니다. dataframe/dataset을 사용하면 원하는 작업을 결정하고 계산 방법을 결정하기 위해 스파크에 모든 것을 맡길 수 있습니다.
c. RDD 메모리 내의 jvm 객체인 RDD는 가비지 컬렉션과 자바(또는 조금 나은 Kryo)의 오버헤드를 수반합니다.데이터 증가 시 비용이 많이 드는 직렬화.그것은 성능을 저하시키는 것입니다.
데이터 프레임은 다음과 같은 두 가지 강력한 기능을 갖추고 있기 때문에 RDD에 비해 성능이 크게 향상됩니다.
- 맞춤형 메모리 관리(일명 Project Tungsten)
- 최적화된 실행 계획 일명 (( Catalyst Optimizer
에서 RDD > 프레임 ->능 RDD ->터임 ->셋서셋
d. 데이터셋(Project Tungsten 및 Catalyst Optimizer)이 데이터 프레임을 통해 점수를 매기는 방법은 다음과 같은 추가 기능을 가지고 있습니다. 인코더
Spark RDD (resilient distributed dataset)
:
RDD는 핵심 데이터 추상화 API로 Spark(Spark 1.0)의 첫 번째 릴리스부터 사용할 수 있습니다.분산된 데이터 수집을 조작하기 위한 하위 API입니다.RDD API는 기본 물리적 데이터 구조를 매우 엄격하게 제어하는 데 사용할 수 있는 매우 유용한 방법을 제공합니다.서로 다른 컴퓨터에 배포되는 파티션된 데이터의 불변(읽기 전용) 모음입니다.RDD는 대용량 클러스터에서 메모리 내 계산을 가능하게 하여 무장애 방식으로 빅데이터 처리 속도를 높입니다.내결함성을 활성화하기 위해 RDD는 꼭짓점과 모서리 집합으로 구성된 DAG(Directed Asyclic Graph)를 사용합니다.DAG의 정점과 에지는 각각 RDD와 해당 RDD에 적용될 연산을 나타냅니다.RDD에 정의된 변환은 게으르고 동작이 호출될 때만 실행됩니다.
Spark DataFrame
:
스파크 1.3은 데이터 프레임(DataFrame)과 데이터셋(DataSet) 두 가지 새로운 데이터 추상화 API를 선보였습니다.DataFrame API는 관계형 데이터베이스의 테이블처럼 데이터를 명명된 열로 구성합니다.프로그래머들이 분산된 데이터 집합에 스키마를 정의할 수 있게 해줍니다.DataFrame의 각 행은 개체 유형 행입니다.SQL 테이블과 마찬가지로 각 열은 DataFrame에서 동일한 수의 행을 가져야 합니다.즉, DataFrame은 데이터의 분산 수집에 대해 수행해야 할 작업을 지정하는 게으르게 평가된 계획입니다.DataFrame은 불변의 컬렉션이기도 합니다.
Spark DataSet
:
또한 스파크 1.3은 DataFrame API의 확장으로 스파크에 엄격하게 타이핑되고 객체 지향 프로그래밍 인터페이스를 제공하는 DataSet API를 도입했습니다.이것은 불변의 안전한 분산 데이터 수집입니다.DataFrame과 마찬가지로 DataSet API도 Catalyst 엔진을 사용하여 실행 최적화를 지원합니다.DataSet은 DataFrame API의 확장입니다.
Other Differences
-
DataFrame은 스키마가 있는 RDD입니다.각 열에 이름과 알려진 유형이 있다는 점에서 관계형 데이터베이스 테이블이라고 생각할 수 있습니다.DataFrame의 장점은 구조화된 데이터셋(Json, Parquet...)에서 DataFrame을 생성하면 Spark가 로드 중인 전체 데이터셋(Json, Parquet...)을 통과하여 스키마를 추론할 수 있다는 사실에서 비롯됩니다.그러면 실행 계획을 계산할 때 Spark는 스키마를 사용할 수 있고 계산 최적화를 훨씬 더 잘 수행할 수 있습니다.DataFrame은 Spark v1.3.0 이전에는 SchemaRDD라고 불렸습니다.
Apache Spark – RDD, DataFrame 및 DataSet
스파크 RDD –
RDD는 복원력 있는 분산 데이터셋을 의미합니다.레코드의 읽기 전용 파티션 모음입니다.RDD는 스파크의 기본 데이터 구조입니다.프로그래머가 대용량 클러스터에서 내결함성 방식으로 메모리 내 계산을 수행할 수 있게 해줍니다.따라서 작업 속도를 높입니다.
스파크 데이터 프레임 –
RDD와 달리 데이터는 명명된 열로 구성됩니다.예를 들어 관계형 데이터베이스의 표입니다.이것은 불변의 분산된 데이터 모음입니다.Spark의 DataFrame은 개발자들이 분산된 데이터 집합에 구조를 적용할 수 있도록 하여 높은 수준의 추상화를 가능하게 합니다.
스파크 데이터셋 –
Apache Spark의 데이터셋은 DataFrame API의 확장으로, 안전한 객체 지향 프로그래밍 인터페이스를 제공합니다.데이터셋은 식과 데이터 필드를 쿼리 플래너에 노출함으로써 스파크의 Catalyst Optimizer를 활용합니다.
언급URL : https://stackoverflow.com/questions/31508083/difference-between-dataframe-dataset-and-rdd-in-spark
'programing' 카테고리의 다른 글
열 별칭을 동일한 선택에 사용 (0) | 2023.09.14 |
---|---|
array_parray 대 $array[] = ...어느것이 가장 빠릅니까? (0) | 2023.09.14 |
ASP.NET - 정적 메서드/정적 클래스에서 세션에 액세스하시겠습니까? (0) | 2023.09.14 |
MySQL 오류:최대 열 크기는 767바이트입니다. (0) | 2023.09.14 |
MySQL 데이터베이스에서 이미지를 검색하고 HTML 태그에 표시하는 방법 (0) | 2023.09.14 |