回答:
A DataFrame
は、「DataFrame定義」のGoogle検索で適切に定義されています。
データフレームはテーブルまたは2次元配列のような構造で、各列には1つの変数の測定値が含まれ、各行には1つのケースが含まれます。
したがって、にDataFrame
は表形式のフォーマットによる追加のメタデータがあり、これにより、Sparkは最終的なクエリに対して特定の最適化を実行できます。
ANはRDD
、一方で、単にあるR esilient D istributed Dよりそれに対して行うことができる操作は、のように制約されないように最適化することができないデータのブラックボックスのあるataset。
ただし、DataFrameからRDD
そのrdd
メソッドを介してに移動でき、メソッドを介しRDD
てDataFrame
(RDDが表形式の場合)からに移動できtoDF
ます。
一般にDataFrame
、クエリの最適化が組み込まれているため、可能な場合はを使用することをお勧めします。
まずは
DataFrame
から進化したものですSchemaRDD
。
はい...との間の変換Dataframe
とはRDD
絶対に可能です。
以下はサンプルコードスニペットです。
df.rdd
です RDD[Row]
以下は、データフレームを作成するためのオプションの一部です。
1)にyourrddOffrow.toDF
変換されDataFrame
ます。
2)createDataFrame
SQLコンテキストの使用
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があります。
RDD
API:
RDD
(弾力性のある分散型データセット)APIは1.0のリリース以来、スパークしてきました。
RDD
APIは、次のような多くの形質転換法を提供するmap
、()filter
()、およびreduce
データ計算を実行するための()。これらの各メソッドによりRDD
、変換されたデータを表す新しいものが生成されます。ただし、これらのメソッドは実行される操作を定義するだけであり、アクションメソッドが呼び出されるまで変換は実行されません。アクションメソッドの例はcollect
()とsaveAsObjectFile
()です。
RDDの例:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
例:RDDを使用して属性でフィルターする
rdd.filter(_.age > 21)
DataFrame
APISpark 1.3では、Spark
DataFrame
のパフォーマンスとスケーラビリティの向上を目指すProject Tungstenイニシアチブの一部として新しいAPIが導入されました。DataFrame
APIは、Javaのシリアライゼーションを使用するよりもはるかに効率的な方法で、スパークは、スキーマを管理し、唯一のノード間でデータを渡すためにできるように、データを記述するためのスキーマの概念を導入しています。
DataFrame
APIは、より根本的に異なっているRDD
、それはスパークの触媒オプティマイザが、その後実行できるリレーショナルクエリプランを構築するためのAPIであるため、API。APIは、クエリプランの作成に慣れている開発者にとって自然なものです。
SQLスタイルの例:
df.filter("age > 21");
制限: コードはデータ属性を名前で参照しているため、コンパイラーがエラーをキャッチすることはできません。属性名が正しくない場合、エラーはクエリプランが作成された実行時にのみ検出されます。
DataFrame
API のもう1つの欠点は、非常にスカラー中心であり、Javaをサポートしていますが、サポートが制限されていることです。
たとえばDataFrame
、既存RDD
のJavaオブジェクトからを作成する場合、SparkのCatalystオプティマイザーはスキーマを推測できず、DataFrame内のオブジェクトがscala.Product
インターフェイスを実装していると想定します。Scala case class
は、このインターフェースを実装しているため、すぐに機能します。
Dataset
API
Dataset
スパーク1.6でAPIプレビューとしてリリースAPIは、両方の長所を提供することを目的とします。RDD
API はおなじみのオブジェクト指向プログラミングスタイルとコンパイル時のタイプセーフですが、Catalystクエリオプティマイザーのパフォーマンス上の利点があります。データセットは、DataFrame
API と同じ効率的なオフヒープストレージメカニズムも使用し ます。データのシリアル化に関しては、
Dataset
APIには、JVM表現(オブジェクト)とSparkの内部バイナリ形式との間で変換を行うエンコーダーの概念が あります。Sparkには組み込みのエンコーダーがあり、オフヒープデータとやり取りするバイトコードを生成し、オブジェクト全体を逆シリアル化することなく個々の属性へのオンデマンドアクセスを提供するという点で優れています。Sparkはカスタムエンコーダーを実装するためのAPIをまだ提供していませんが、将来のリリースで計画されています。さらに、
Dataset
APIはJavaとScalaの両方で同等に機能するように設計されています。Javaオブジェクトを使用する場合、オブジェクトが完全にBeanに準拠していることが重要です。
Dataset
API SQLスタイルの例:
dataset.filter(_.age < 21);
カタリストレベルのフロー。。(sparkサミットからのDataFrameとDatasetのプレゼンテーションの説明)
さらに読む... databricks 記事 -3 つのApache Spark APIの物語:RDDとデータフレームおよびデータセット
df.filter("age > 21");
これは、実行時にのみ評価/分析できます。その文字列以来。データセットの場合、データセットはBeanに準拠しています。つまり、年齢は豆の特性です。Beanにageプロパティがない場合は、IEコンパイル時(つまりdataset.filter(_.age < 21);
)の早い段階で知ることができます。分析エラーは評価エラーとして名前を変更できます。
Apache Sparkは3種類のAPIを提供します
以下は、RDD、データフレーム、データセットのAPI比較です。
Sparkが提供する主な抽象化は、復元力のある分散データセット(RDD)です。これは、並列で操作できるクラスターのノード間で分割された要素のコレクションです。
分散コレクション:
RDDはMapReduce操作を使用します。これは、クラスターで並列分散アルゴリズムを使用して大規模なデータセットを処理および生成するために広く採用されています。これにより、ユーザーは、作業の分散やフォールトトレランスを心配することなく、一連の高水準演算子を使用して並列計算を記述できます。
不変:パーティション化されたレコードのコレクションで構成されるRDD。パーティションはRDDの並列処理の基本単位であり、各パーティションはデータの1つの論理的な分割であり、不変であり、既存のパーティションのいくつかの変換によって作成されます。不変性は、計算の一貫性を実現するのに役立ちます。
フォールトトレラント: RDDの一部のパーティションが失われた場合、複数のノード間でデータレプリケーションを実行するのではなく、そのパーティションで変換を系統的に再生して同じ計算を実行できます。この特性は、RDDの最大の利点です。データ管理と複製に多くの労力を費やし、より高速な計算を実現します。
遅延評価: Sparkのすべての変換は遅延であり、結果はすぐには計算されません。代わりに、一部のベースデータセットに適用された変換を覚えているだけです。変換は、アクションが結果をドライバープログラムに返す必要がある場合にのみ計算されます。
関数変換: RDDは、既存のデータセットから新しいデータセットを作成する変換と、データセットで計算を実行した後にドライバープログラムに値を返すアクションの2種類の操作をサポートします。
データ処理フォーマット:
構造化データと非構造化データを簡単かつ効率的に処理できます。
サポートされるプログラミング言語:
RDD APIは、Java、Scala、Python、Rで使用できます。
組み込みの最適化エンジンなし: 構造化データを操作する場合、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で使用できます。
例:
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
これは、いくつかの変換および集計手順を使用している場合は特に困難です。
例:
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は、タイプセーフなオブジェクト指向プログラミングインターフェイスを提供する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]
例:
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での型キャスト要件の課題により、必要な型安全性が失われ、コードが脆弱になります。
Dataset
はLINQではなく、ラムダ式は式ツリーとして解釈できません。したがって、ブラックボックスがあり、オプティマイザのメリット(すべてではないにしても)のほとんどを失うことになります。考えられるマイナス面のほんの一部です:Spark 2.0データセットとデータフレーム。また、私が何度か述べた何かを繰り返すために-一般に、エンドツーエンドの型チェックはDataset
API では不可能です。結合は、最も顕著な例にすぎません。
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.
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オブジェクトをSparkのデータフレームに変換する
2. DataFrame
/ DataSet
をRDD
持つ.rdd()
方法
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
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]
実際People
にdeptId
はが列型ではなく実際の整数型であるオブジェクトを取得しているため、型システムを利用しています。
Spark 2.0以降、DataFrame APIとDataSet APIは統合され、DataFrame
のタイプエイリアスになりDataSet[Row]
ます。
DataFrame
APIの変更を壊さないようにするために別々にしておく主な理由がありました。とにかく、指摘したかっただけです。私からの編集と賛成票をありがとう。
単にRDD
コアコンポーネントですがDataFrame
、spark 1.30で導入されたAPIです。
と呼ばれるデータパーティションのコレクションRDD
。これらRDD
は、次のようないくつかのプロパティに従う必要があります。
ここにRDD
構造化または非構造化があります。
DataFrame
Scala、Java、Python、Rで利用可能なAPIです。あらゆるタイプの構造化データと半構造化データを処理できます。定義するにDataFrame
は、という名前の列に編成された分散データのコレクションDataFrame
。あなたは簡単に最適化することが可能RDDs
にDataFrame
。を使用して、JSONデータ、寄木細工データ、HiveQLデータを一度に処理できますDataFrame
。
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
ここで、Sample_DFはと見なされDataFrame
ます。sampleRDD
と呼ばれる(生データ)RDD
です。
正解のほとんどはここに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データフレームの会話の答えを見つけることができます
DataFrameはRDBMSのテーブルに相当し、RDDの「ネイティブ」分散コレクションと同様の方法で操作できます。RDDとは異なり、データフレームはスキーマを追跡し、より最適化された実行につながるさまざまなリレーショナル操作をサポートします。各DataFrameオブジェクトは論理プランを表しますが、その「遅延」の性質のため、ユーザーが特定の「出力操作」を呼び出すまで実行は発生しません。
お役に立てば幸いです。
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
-
A データフレームは、スキーマを持つRDDです。これは、各列に名前と既知のタイプがあるという点で、リレーショナルデータベーステーブルと考えることができます。DataFrameの威力は、構造化データセット(Json、Parquet ..)からDataFrameを作成するときに、Sparkが(Json、Parquet ..)データセット全体にパスを渡すことでスキーマを推測できるという事実に由来します。ロードされています。その後、実行計画を計算するとき、Sparkはスキーマを使用して、大幅に優れた計算最適化を実行できます。DataFrameはSpark v1.3.0より前はSchemaRDDと呼ばれていたことに注意してください。
Spark RDD –
RDDは、耐障害性のある分散データセットの略です。レコードの読み取り専用パーティションコレクションです。RDDはSparkの基本的なデータ構造です。これにより、プログラマーはフォールトトレラントな方法で大規模なクラスターでメモリ内計算を実行できます。したがって、タスクをスピードアップします。
Spark Dataframe –
RDDとは異なり、名前付きの列に編成されたデータ。たとえば、リレーショナルデータベースのテーブルです。これは、不変の分散データコレクションです。SparkのDataFrameを使用すると、開発者は分散したデータのコレクションに構造を課すことができ、より高いレベルの抽象化が可能になります。
Sparkデータセット –
Apache SparkのデータセットはDataFrame APIの拡張であり、タイプセーフなオブジェクト指向プログラミングインターフェースを提供します。データセットは、式とデータフィールドをクエリプランナーに公開することで、SparkのCatalystオプティマイザーを利用します。
すべての素晴らしい答えと各APIの使用には、トレードオフがあります。データセットは多くの問題を解決するスーパーAPIとして構築されていますが、多くの場合、データを理解し、処理アルゴリズムが大きなデータへのシングルパスで多くのことを実行するように最適化されている場合、RDDは最適に機能します。
データセットAPIを使用した集計は引き続きメモリを消費し、時間の経過とともに改善されます。