Spark における DataFrame、Dataset、RDD の違い 質問する

Spark における DataFrame、Dataset、RDD の違い 質問する

Apache Spark のRDDDataFrame (Spark 2.0.0 DataFrame は の単なる型エイリアスですDataset[Row])の違いは何でしょうか?

一方を他方に変換できますか?

ベストアンサー1

まず第一に、DataFrameは から進化しましたSchemaRDD

非推奨メソッド toSchemaRDD

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

以下にいくつかのサンプルコードスニペットを示します。

  • df.rddRDD[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

スキーマは、およびを使用して作成することもできますStructTypeStructField

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

画像の説明

実際のところ、Apache Spark API は現在 3 つあります。

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

  1. RDDAPI:

(Resilient Distributed Dataset) APIRDDは、1.0 リリース以降、Spark に含まれています。

APIには、データに対して計算を実行するための()、()、 ()RDDなどの多くの変換メソッドが用意されています。これらの各メソッドは、変換されたデータを表す新しい を生成します。ただし、これらのメソッドは実行される操作を定義するだけであり、アクション メソッドが呼び出されるまで変換は実行されません。アクション メソッドの例には、() や() などがあります。mapfilterreduceRDDcollectsaveAsObjectFile

RDDの例:

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

例: RDD で属性をフィルタリングする

rdd.filter(_.age > 21)
  1. DataFrameAPI

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

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

SQL スタイルの例:

df.filter("age > 21");

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

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

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

  1. DatasetAPI

DatasetSpark 1.6 で API プレビューとしてリリースされたこのAPI は、使い慣れたオブジェクト指向プログラミング スタイルとRDDAPI のコンパイル時の型安全性、そして Catalyst クエリ オプティマイザーのパフォーマンス上の利点という両方の長所を提供することを目指しています。データセットも API と同じ効率的なオフヒープ ストレージ メカニズムを使用しますDataFrame

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

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

DatasetAPI SQL スタイルの例:

dataset.filter(_.age < 21);

DataFrameとの評価の違いDataSet: ここに画像の説明を入力してください

カタリストレベルフロー。(Spark Summit の DataFrame と Dataset の謎を解くプレゼンテーション) ここに画像の説明を入力してください

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

おすすめ記事