SparkのDataFrame、Dataset、RDDの違い


回答:


232

A DataFrameは、「DataFrame定義」のGoogle検索で適切に定義されています。

データフレームはテーブルまたは2次元配列のような構造で、各列には1つの変数の測定値が含まれ、各行には1つのケースが含まれます。

したがって、にDataFrameは表形式のフォーマットによる追加のメタデータがあり、これにより、Sparkは最終的なクエリに対して特定の最適化を実行できます。

ANはRDD、一方で、単にあるR esilient D istributed Dよりそれに対して行うことができる操作は、のように制約されないように最適化することができないデータのブラックボックスのあるataset。

ただし、DataFrameからRDDそのrddメソッドを介してに移動でき、メソッドを介しRDDDataFrame(RDDが表形式の場合)からに移動できtoDFます。

一般DataFrame、クエリの最適化が組み込まれているため、可能場合はを使用することをお勧めします。


6
回答では、データセットについての説明はありません。Spark- The Definitive Guideによると、データセットはタイプセーフな構造化APIです。そのため、事前にスキーマのタイプを提供できます。
Chintan Pandya

3
ありがとう-元のタイトルと説明は元の質問(データセットを含まない)の後でよく編集されました
Justin Pihony

219

まずはDataFrameから進化したものですSchemaRDD

非推奨のメソッドtoSchemaRDD

はい...との間の変換DataframeとはRDD絶対に可能です。

以下はサンプルコードスニペットです。

  • df.rdd です RDD[Row]

以下は、データフレームを作成するためのオプションの一部です。

  • 1)にyourrddOffrow.toDF変換されDataFrameます。

  • 2)createDataFrameSQLコンテキストの使用

    val df = spark.createDataFrame(rddOfRow, schema)

どこスキーマはオプション以下のいくつかに由来することができる。..素敵SOポストによって記載されているように
ScalaのケースクラスとScalaの反射APIから

import org.apache.spark.sql.catalyst.ScalaReflection
val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]

または使用 Encoders

import org.apache.spark.sql.Encoders
val mySchema = Encoders.product[MyCaseClass].schema

スキーマで説明されているように、StructTypeおよびを使用して 作成することもできますStructField

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

画像の説明

実際、現在3つのApache Spark APIがあります。

ここに画像の説明を入力してください

  1. RDD API:

RDD(弾力性のある分散型データセット)APIは1.0のリリース以来、スパークしてきました。

RDDAPIは、次のような多くの形質転換法を提供するmap、() filter()、およびreduceデータ計算を実行するための()。これらの各メソッドによりRDD、変換されたデータを表す新しいものが生成されます。ただし、これらのメソッドは実行される操作を定義するだけであり、アクションメソッドが呼び出されるまで変換は実行されません。アクションメソッドの例はcollect()と saveAsObjectFile()です。

RDDの例:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

例:RDDを使用して属性でフィルターする

rdd.filter(_.age > 21)
  1. DataFrame API

Spark 1.3では、Spark DataFrameのパフォーマンスとスケーラビリティの向上を目指すProject Tungstenイニシアチブの一部として新しいAPIが導入されました。DataFrameAPIは、Javaのシリアライゼーションを使用するよりもはるかに効率的な方法で、スパークは、スキーマを管理し、唯一のノード間でデータを渡すためにできるように、データを記述するためのスキーマの概念を導入しています。

DataFrameAPIは、より根本的に異なっているRDD、それはスパークの触媒オプティマイザが、その後実行できるリレーショナルクエリプランを構築するためのAPIであるため、API。APIは、クエリプランの作成に慣れている開発者にとって自然なものです。

SQLスタイルの例:

df.filter("age > 21");

制限: コードはデータ属性を名前で参照しているため、コンパイラーがエラーをキャッチすることはできません。属性名が正しくない場合、エラーはクエリプランが作成された実行時にのみ検出されます。

DataFrameAPI のもう1つの欠点は、非常にスカラー中心であり、Javaをサポートしていますが、サポートが制限されていることです。

たとえばDataFrame、既存RDDのJavaオブジェクトからを作成する場合、SparkのCatalystオプティマイザーはスキーマを推測できず、DataFrame内のオブジェクトがscala.Productインターフェイスを実装していると想定します。Scala case classは、このインターフェースを実装しているため、すぐに機能します。

  1. Dataset API

Datasetスパーク1.6でAPIプレビューとしてリリースAPIは、両方の長所を提供することを目的とします。RDDAPI はおなじみのオブジェクト指向プログラミングスタイルとコンパイル時のタイプセーフですが、Catalystクエリオプティマイザーのパフォーマンス上の利点があります。データセットは、DataFrameAPI と同じ効率的なオフヒープストレージメカニズムも使用し ます。

データのシリアル化に関しては、DatasetAPIには、JVM表現(オブジェクト)とSparkの内部バイナリ形式との間で変換を行うエンコーダーの概念が あります。Sparkには組み込みのエンコーダーがあり、オフヒープデータとやり取りするバイトコードを生成し、オブジェクト全体を逆シリアル化することなく個々の属性へのオンデマンドアクセスを提供するという点で優れています。Sparkはカスタムエンコーダーを実装するためのAPIをまだ提供していませんが、将来のリリースで計画されています。

さらに、DatasetAPIはJavaとScalaの両方で同等に機能するように設計されています。Javaオブジェクトを使用する場合、オブジェクトが完全にBeanに準拠していることが重要です。

DatasetAPI SQLスタイルの例:

dataset.filter(_.age < 21);

評価は異なります。DataFrame&の間DataSet ここに画像の説明を入力してください

カタリストレベルのフロー。。(sparkサミットからのDataFrameとDatasetのプレゼンテーションの説明) ここに画像の説明を入力してください

さらに読む... databricks 記事 -3 つのApache Spark APIの物語:RDDとデータフレームおよびデータセット


強く型付けされた構造データセットとは何ですか?DataFrameとの違いは何ですか?
Arvind Kumar

データセットにはどのような分析エラーが含まれますか?
Neeleshkumar S 2017

5
@ neelesh-srinivasan:データフレーム構文の例をとります。df.filter("age > 21");これは、実行時にのみ評価/分析できます。その文字列以来。データセットの場合、データセットはBeanに準拠しています。つまり、年齢は豆の特性です。Beanにageプロパティがない場合は、IEコンパイル時(つまりdataset.filter(_.age < 21);)の早い段階で知ることができます。分析エラーは評価エラーとして名前を変更できます。
Ram Ghadiyaram 2017年

@NeeleshSrinivasan:詳細と詳細については、apache-spark-api-comparision
Ram Ghadiyaram

最初の写真は誤解を招くものです。データセットはPythonでは利用できません
Yeikel

135

Apache Sparkは3種類のAPIを提供します

  1. RDD
  2. DataFrame
  3. データセット

RDD、データフレーム、データセットAPIの比較

以下は、RDD、データフレーム、データセットのAPI比較です。

RDD

Sparkが提供する主な抽象化は、復元力のある分散データセット(RDD)です。これは、並列で操作できるクラスターのノード間で分割された要素のコレクションです。

RDD機能:-

  • 分散コレクション:
    RDDはMapReduce操作を使用します。これは、クラスターで並列分散アルゴリズムを使用して大規模なデータセットを処理および生成するために広く採用されています。これにより、ユーザーは、作業の分散やフォールトトレランスを心配することなく、一連の高水準演算子を使用して並列計算を記述できます。

  • 不変:パーティション化されたレコードのコレクションで構成されるRDD。パーティションはRDDの並列処理の基本単位であり、各パーティションはデータの1つの論理的な分割であり、不変であり、既存のパーティションのいくつかの変換によって作成されます。不変性は、計算の一貫性を実現するのに役立ちます。

  • フォールトトレラント: RDDの一部のパーティションが失われた場合、複数のノード間でデータレプリケーションを実行するのではなく、そのパーティションで変換を系統的に再生して同じ計算を実行できます。この特性は、RDDの最大の利点です。データ管理と複製に多くの労力を費やし、より高速な計算を実現します。

  • 遅延評価: Sparkのすべての変換は遅延であり、結果はすぐには計算されません。代わりに、一部のベースデータセットに適用された変換を覚えているだけです。変換は、アクションが結果をドライバープログラムに返す必要がある場合にのみ計算されます。

  • 関数変換: RDDは、既存のデータセットから新しいデータセットを作成する変換と、データセットで計算を実行した後にドライバープログラムに値を返すアクションの2種類の操作をサポートします。

  • データ処理フォーマット:
    構造化データと非構造化データを簡単かつ効率的に処理できます。

  • サポートされるプログラミング言語:
    RDD APIは、Java、Scala、Python、Rで使用できます。

RDDの制限:-

  • 組み込みの最適化エンジンなし: 構造化データを操作する場合、RDDは、Catalystオプティマイザやタングステン実行エンジンなどのSparkの高度なオプティマイザを利用できません。開発者は、その属性に基づいて各RDDを最適化する必要があります。

  • 構造化データの処理: Dataframeやデータセットとは異なり、RDDは取り込まれたデータのスキーマを推測せず、ユーザーが指定する必要があります。

データフレーム

Sparkは、Spark 1.3リリースでデータフレームを導入しました。データフレームは、RDDが抱えていた主要な課題を克服します。

DataFrameは、名前付きの列に編成されたデータの分散コレクションです。概念的には、リレーショナルデータベースまたはR / Pythonデータフレームのテーブルと同等です。Sparkは、Dataframeとともに、高度なプログラミング機能を利用して拡張可能なクエリオプティマイザーを構築するCatalystオプティマイザーも導入しました。

データフレーム機能:-

  • 行オブジェクトの分散コレクション: DataFrameは、名前付き列に編成されたデータの分散コレクションです。概念的にはリレーショナルデータベースのテーブルと同等ですが、内部ではより高度な最適化が行われます。

  • データ処理: 構造化および非構造化データ形式(Avro、CSV、Elastic Search、およびCassandra)およびストレージシステム(HDFS、HIVEテーブル、MySQLなど)の処理。それはこれらすべてのさまざまなデータソースから読み書きできます。

  • Catalyst オプティマイザを使用した最適化: 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.
    
  • Hiveの互換性: Spark SQLを使用すると、既存のHiveウェアハウスで変更されていないHiveクエリを実行できます。HiveフロントエンドとMetaStoreを再利用し、既存のHiveデータ、クエリ、UDFとの完全な互換性を提供します。

  • タングステン: タングステンは、メモリを明示的に管理し、式の評価用のバイトコードを動的に生成する物理実行バックエンドを提供します。

  • サポートされるプログラミング言語:
    Dataframe APIは、Java、Scala、Python、および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

これは、いくつかの変換および集計手順を使用している場合は特に困難です。

  • ドメインオブジェクト(失われたドメインオブジェクト)を操作できません: ドメインオブジェクトをデータフレームに変換すると、それを再生成できなくなります。次の例では、personRDDからpersonDFを作成すると、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は、タイプセーフなオブジェクト指向プログラミングインターフェイスを提供するDataFramesの拡張機能です。これは、リレーショナルスキーマにマップされるオブジェクトの強く型付けされた不変のコレクションです。

データセットの中心にあるAPIは、エンコーダーと呼ばれる新しい概念であり、JVMオブジェクトと表形式表現の間の変換を行います。表形式の表現はSparkの内部Tungstenバイナリ形式を使用して保存されるため、シリアル化されたデータの操作とメモリ使用率の向上が可能です。Spark 1.6は、プリミティブ型(String、Integer、Longなど)、Scalaケースクラス、Java Beansなど、さまざまな型のエンコーダーの自動生成をサポートしています。

データセットの機能:-

  • RDDとDataframeの両方のベストを提供します: RDD(関数型プログラミング、タイプセーフ)、DataFrame(リレーショナルモデル、クエリ最適化、Tungsten実行、ソート、シャッフル)

  • エンコーダー:エンコーダーを 使用すると、JVMオブジェクトをデータセットに簡単に変換できるため、ユーザーはデータフレームとは異なり、構造化データと非構造化データの両方を操作できます。

  • サポートされるプログラミング言語: データセットAPIは現在、ScalaとJavaでのみ使用できます。PythonとRは現在バージョン1.6ではサポートされていません。Pythonのサポートはバージョン2.0で予定されています。

  • 型の安全性: Datasets APIは、Dataframesでは利用できなかったコンパイル時の安全性を提供します。以下の例では、ラムダ関数をコンパイルして、Datasetがドメインオブジェクトを操作する方法を確認できます。

例:

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オプティマイザーは使用されません。

例:

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での型キャスト要件の課題により、必要な型安全性が失われ、コードが脆弱になります。


2
spark.apache.org/docs/latest/…から、Scala APIでは、DataFrameは単にDataset [Row]の型エイリアスです。
Dean Chen、

データセットを使用すると、タイプセーフが得られ、オプティマイザが失われると言っても大丈夫ですか。
Khoa

@BlueSkyあなたはタイプセーフを手に入れ、それでもオプティマイザを持っています
Gabber

@AmitDubeyそれは真実ではありません。DatasetはLINQではなく、ラムダ式は式ツリーとして解釈できません。したがって、ブラックボックスがあり、オプティマイザのメリット(すべてではないにしても)のほとんどを失うことになります。考えられるマイナス面のほんの一部です:Spark 2.0データセットとデータフレーム。また、私が何度か述べた何かを繰り返すために-一般に、エンドツーエンドの型チェックはDatasetAPI では不可能です。結合は、最も顕著な例にすぎません。
zero323

52

1つの画像内のすべて(RDD、DataFrameおよびDataSet)。

RDD vs DataFrame vs DataSet

画像クレジット

RDD

RDD 並行して操作できる要素のフォールトトレラントなコレクションです。

DataFrame

DataFrame名前付きの列に編成されたデータセットです。概念的には、リレーショナルデータベースのテーブルやR / Pythonのデータフレームと同等ですが、内部ではより最適化されています。

Dataset

Datasetデータの分散コレクションです。データセットはSpark 1.6に追加された新しいインターフェースであり、RDD利点 (強力な型指定、強力なラムダ関数を使用できる機能)と Spark SQLの最適化された実行エンジンの利点を提供します


注意:

Dataset[Row]Scala / Java の行のデータセット()は、しばしばDataFramesと呼ばれます


Nice comparison of all of them with a code snippet.

RDD vs DataFrame vs DataSetとコード

ソース


Q:RDDからDataFrameへ、またはその逆のように、一方を他方に変換できますか?

はい、両方可能です

1. RDDDataFrame.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オブジェクトをSparkのデータフレームに変換する

2. DataFrame/ DataSetRDD持つ.rdd()方法

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD

27

DataFrame弱く型付けされているため、開発者は型システムの利点を享受できません。たとえば、SQLから何かを読み取り、それに対して何らかの集計を実行するとします。

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]

実際PeopledeptIdはが列型ではなく実際の整数型であるオブジェクトを取得しているため、型システムを利用しています。

Spark 2.0以降、DataFrame APIとDataSet APIは統合され、DataFrameのタイプエイリアスになりDataSet[Row]ます。


5
正確には、Spark 2.0 Dataframe は単なるエイリアスですDataset[Row]
zero323

1
@ zero323はい、確かに、しかしそれはまだ弱く型付けされています、それは私が伝えようとしていたことです。
ユヴァルイチャコフ2016年

ええ、でもそれはコンテナ自体よりも保存された値の問題です。1.6でもこれら2つは技術的には同じであり、DataFrameAPIの変更を壊さないようにするために別々にしておく主な理由がありました。とにかく、指摘したかっただけです。私からの編集と賛成票をありがとう。
zero323 2016年

25

単にRDDコアコンポーネントですがDataFrame、spark 1.30で導入されたAPIです。

RDD

と呼ばれるデータパーティションのコレクションRDD。これらRDDは、次のようないくつかのプロパティに従う必要があります。

  • 不変、
  • 耐障害性、
  • 分散、
  • もっと。

ここにRDD構造化または非構造化があります。

DataFrame

DataFrameScala、Java、Python、Rで利用可能なAPIです。あらゆるタイプの構造化データと半構造化データを処理できます。定義するにDataFrameは、という名前の列に編成された分散データのコレクションDataFrame。あなたは簡単に最適化することが可能RDDsDataFrame。を使用して、JSONデータ、寄木細工データ、HiveQLデータを一度に処理できますDataFrame

val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")

val sample_DF = sampleRDD.toDF()

ここで、Sample_DFはと見なされDataFrameます。sampleRDDと呼ばれる(生データ)RDDです。


12

正解のほとんどはここに1点追加したいだけです

Spark 2.0では、2つのAPI(DataFrame + DataSet)が1つのAPIに統合されます。

「DataFrameとDatasetの統合:ScalaとJavaでは、DataFrameとDatasetが統合されました。つまり、DataFrameはDataset of Rowの単なる型エイリアスです。PythonとRでは、型の安全性がないため、DataFrameがメインのプログラミングインターフェイスです。」

データセットはRDDに似ていますが、JavaシリアライゼーションまたはKryoを使用する代わりに、専用のエンコーダーを使用してオブジェクトをシリアライズし、ネットワーク上で処理または送信します。

Spark SQLは、既存のRDDをデータセットに変換する2つの異なる方法をサポートしています。最初の方法では、リフレクションを使用して、特定のタイプのオブジェクトを含むRDDのスキーマを推測します。このリフレクションベースのアプローチは、より簡潔なコードにつながり、Sparkアプリケーションの作成中にスキーマを既に知っている場合にうまく機能します。

データセットを作成する2番目の方法は、スキーマを構築して既存のRDDに適用できるようにするプログラムインターフェイスを使用する方法です。この方法はより冗長ですが、実行時まで列とその型が不明な場合にデータセットを構築できます。

ここでは、RDD tofデータフレームの会話の答えを見つけることができます

SparkでRDDオブジェクトをデータフレームに変換する方法


8

DataFrameはRDBMSのテーブルに相当し、RDDの「ネイティブ」分散コレクションと同様の方法で操作できます。RDDとは異なり、データフレームはスキーマを追跡し、より最適化された実行につながるさまざまなリレーショナル操作をサポートします。各DataFrameオブジェクトは論理プランを表しますが、その「遅延」の性質のため、ユーザーが特定の「出力操作」を呼び出すまで実行は発生しません。


2
ちなみに、RDDも遅延しています。
kon psych 2016年

6

使用法の観点からの洞察、RDD対DataFrame:

  1. RDDは素晴らしいです!ほとんどすべての種類のデータを処理するための柔軟性をすべて備えているため。非構造化、半構造化および構造化データ。多くの場合、データがDataFrame(JSONも含む)に収まる準備ができていないため、RDDを使用してデータを前処理し、データフレームに収まるようにすることができます。RDDはSparkのコアデータ抽象化です。
  2. RDDで可能なすべての変換がDataFrameで可能であるとは限りません。たとえば、subtract()はRDDであり、except()はDataFrameです。
  3. データフレームはリレーショナルテーブルに似ているため、セット/リレーショナル理論変換を使用する場合は厳密な規則に従います。たとえば、2つのデータフレームを結合したい場合、両方のdfに同じ数の列と関連する列のデータ型が必要です。列名は異なる場合があります。これらのルールはRDDには適用されません。ここにこれらの事実を説明する良いチュートリアルがあります。
  4. 他の人がすでに詳しく説明しているように、DataFrameを使用するとパフォーマンスが向上します。
  5. DataFrameを使用すると、RDDでプログラミングする場合のように任意の関数を渡す必要がありません。
  6. データフレームがSparkエコシステムのSparkSQL領域にあるため、データフレームをプログラムするにはSQLContext / HiveContextが必要ですが、RDDにはSpark CoreライブラリにあるSparkContext / JavaSparkContextのみが必要です。
  7. スキーマを定義できる場合は、RDDからdfを作成できます。
  8. dfをrddに、rddをdfに変換することもできます。

お役に立てば幸いです。


5

データフレームは、行オブジェクトのRDDであり、それぞれがレコードを表します。Dataframeは、その行のスキーマ(つまり、データフィールド)も認識しています。データフレームは通常のRDDのように見えますが、内部的にはスキーマを利用して、より効率的な方法でデータを格納します。さらに、SQLクエリを実行する機能など、RDDでは使用できない新しい操作を提供します。データフレームは、外部データソース、クエリの結果、または通常のRDDから作成できます。

参照:Zaharia M.、et al。学習スパーク(O'Reilly、2015)


1

Spark RDD (resilient distributed dataset)

RDDはコアデータ抽象化APIであり、Spark(Spark 1.0)の非常に最初のリリース以降に使用できます。これは、データの分散収集を操作するための下位レベルのAPIです。RDD APIは、基盤となる物理データ構造を非常に厳密に制御するために使用できるいくつかの非常に便利なメソッドを公開しています。これは、さまざまなマシンに分散されたパーティション化されたデータの不変(読み取り専用)コレクションです。RDDを使用すると、大規模なクラスターでのインメモリ計算が可能になり、フォールトトレラントな方法でビッグデータ処理を高速化できます。フォールトトレランスを有効にするために、RDDは一連の頂点とエッジで構成されるDAG(Directed Acyclic Graph)を使用します。DAGの頂点とエッジは、RDDとそのRDDに適用される操作をそれぞれ表します。RDDで定義された変換は遅延であり、アクションが呼び出されたときにのみ実行されます

Spark DataFrame

Spark 1.3では、DataFrameとDataSetの2つの新しいデータ抽象化APIが導入されました。DataFrame APIは、リレーショナルデータベースのテーブルのような名前付きの列にデータを編成します。プログラマは、データの分散したコレクションにスキーマを定義できます。DataFrameの各行は、オブジェクトタイプの行です。SQLテーブルと同様に、各列はDataFrameの同じ行数でなければなりません。つまり、DataFrameは遅延評価された計画であり、データの分散コレクションに対して実行する必要がある操作を指定します。DataFrameも不変のコレクションです。

Spark DataSet

Spark 1.3では、DataFrame APIの拡張機能として、厳密に型指定されたオブジェクト指向のプログラミングインターフェイスをSparkで提供するDataSet APIも導入されました。分散データの不変でタイプセーフなコレクションです。DataFrameと同様に、DataSet APIも実行の最適化を可能にするためにCatalystエンジンを使用します。DataSetは、DataFrame APIの拡張機能です。

Other Differences -

ここに画像の説明を入力してください


0

A データフレームは、スキーマを持つRDDです。これは、各列に名前と既知のタイプがあるという点で、リレーショナルデータベーステーブルと考えることができます。DataFrameの威力は、構造化データセット(Json、Parquet ..)からDataFrameを作成するときに、Sparkが(Json、Parquet ..)データセット全体にパスを渡すことでスキーマを推測できるという事実に由来します。ロードされています。その後、実行計画を計算するとき、Sparkはスキーマを使用して、大幅に優れた計算最適化を実行できます。DataFrameはSpark v1.3.0より前はSchemaRDDと呼ばれていたことに注意してください。


0

Apache Spark – RDD、DataFrame、およびDataSet

Spark RDD

RDDは、耐障害性のある分散データセットの略です。レコードの読み取り専用パーティションコレクションです。RDDはSparkの基本的なデータ構造です。これにより、プログラマーはフォールトトレラントな方法で大規模なクラスターでメモリ内計算を実行できます。したがって、タスクをスピードアップします。

Spark Dataframe

RDDとは異なり、名前付きの列に編成されたデータ。たとえば、リレーショナルデータベースのテーブルです。これは、不変の分散データコレクションです。SparkのDataFrameを使用すると、開発者は分散したデータのコレクションに構造を課すことができ、より高いレベルの抽象化が可能になります。

Sparkデータセット

Apache SparkのデータセットはDataFrame APIの拡張であり、タイプセーフなオブジェクト指向プログラミングインターフェースを提供します。データセットは、式とデータフィールドをクエリプランナーに公開することで、SparkのCatalystオプティマイザーを利用します。


-1

データフレーム/データセットは構造化データと半構造化データしか処理できないため、構造化および非構造化でRDDを使用できます(適切なスキーマを持っています)


-2

すべての素晴らしい答えと各APIの使用には、トレードオフがあります。データセットは多くの問題を解決するスーパーAPIとして構築されていますが、多くの場合、データを理解し、処理アルゴリズムが大きなデータへのシングルパスで多くのことを実行するように最適化されている場合、RDDは最適に機能します。

データセットAPIを使用した集計は引き続きメモリを消費し、時間の経過とともに改善されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.