2016-02-16 18 views
8

私は最近導入されたSpark Datasetsのフルパワーを理解するのに苦労しています。Spark DataSetとRDDの違い

RDDをいつ使用し、データセットをいつ使用するのがベストプラクティスですか?

announcement Databricksでは、データセットを使用することによって、ランタイムとメモリの両方で驚異的な削減が達成できることが説明されています。それでも、データセットは既存のRDD APIと連携して機能するように設計されていると主張されています。

これは単なる下位互換性の参考にすぎませんか、またはデータセットに対してRDDを使用するシナリオがありますか?

+0

チェックします。https://のstackoverflow。com/a/45253013/1592191 – mrsrinivas

答えて

14

この時点(Spark 1.6.0)DataSet APIは単なるプレビューであり、一部の機能のみが実装されているため、ベストプラクティスについては何も教えていただけません。

概念的スパークDataSetは、追加型の安全性とちょうどDataFrameである(またはあなたが好む場合a glance at the futureDataFrameDataSet[Row]です)。つまり、benefits of CatalystTungstenがすべて取得されます。これには、論理プランおよび物理プランの最適化、ベクトル化されたオペレーション、および低レベルのメモリ管理が含まれます。

あなたが失うのは、柔軟性と透明性です。

まず、お客様のデータは、DataSetと一緒に使用するには、事前にエンコードする必要があります。 Sparkは、プリミティブ型と製品/ケースクラスのエンコーダを提供しています。現在、カスタムシリアル化を定義するために必要なAPIは利用できません。ほとんどの場合、UDT API(例:How to define schema for custom type in Spark SQL?Serialize/Deserialize existing class for spark sql dataframeを参照)とすべての問題が比較的類似しています。それは比較的冗長であり、追加の努力が必要であり、複雑なオブジェクトでははるかに明らかにならない可能性があります。さらに、それはAPIのいくつかの低レベルの側面に触れており、あまりよく説明されていません。

一般的なRDBMSのプランナと同じ問題です。それがない限り素晴らしいです。それは素晴らしいツールです、あなたのデータを分析することができますスマートな変換を行うが、それは間違った道を取ることができ、実行計画に凝視し、物事を動作させる方法を見つけることを試みる。

これは、DataFrame APIとRDD APIの間に置くことができるプレビューに基づいています。これはDataFramesよりも柔軟ですが、依然として同様の最適化を提供し、一般的なデータ処理タスクに適しています。これはRDD APIと同じ柔軟性を提供しません(Catalystの内部構造に深くかかわらず)。

これはちょうど仮説的なもう一つの違いは、それがゲスト言語(R、Python)とやり取りする方法です。 DataFrameと同様にDataSetはJVMに属します。可能な対話は、ネイティブJVM操作(DataFrameの式など)とゲスト側のコード(Python UDFなど)の2つのカテゴリのいずれかに属している可能性があります。残念ながら、2番目の部分では、JVMとゲスト環境の間で高価なラウンドトリップが必要です。

も参照してください:このリンクも

+1

詳細な回答をいただきありがとうございます。 –

関連する問題