現時点 (Spark 1.6.0)DataSet
の API は単なるプレビューであり、機能の小さなサブセットのみが実装されているため、ベスト プラクティスについては何も言えません。
概念的には、Sparkは型安全性が追加されDataSet
た に過ぎません (または、未来を一目見たい場合は です)。つまり、CatalystとTungstenのすべての利点が得られます。これには、論理および物理計画の最適化、ベクトル化された操作、および低レベルのメモリ管理が含まれます。DataFrame
DataFrame
DataSet[Row]
あなたが失うのは、柔軟性と透明性です。
まず、データを で使用する前に、データをエンコードする必要がありますDataSet
。Spark は、プリミティブ型と製品 / ケース クラスのエンコーダを提供しますが、現在のところ、カスタム シリアライゼーションを定義するために必要な API は利用できません。ほとんどの場合、UDT API (たとえば、Spark SQL でカスタム型のスキーマを定義する方法、spark sql データフレームの既存のクラスをシリアル化/逆シリアル化するを参照) に比較的似ており、すべての問題があります。これは比較的冗長であり、追加の作業が必要であり、複雑なオブジェクトを使用すると明らかにならない場合があります。さらに、十分に文書化されていない API の下位レベルの側面にも触れています。
透過性に関しては、典型的な RDBMS のプランナーとほぼ同じ問題です。そうでなくなるまで、それは素晴らしいことです。それは驚くべきツールであり、データを分析し、スマートな変換を行うことができますが、他のツールと同様に、間違った道をたどり、実行計画を見つめたり、物事を機能させる方法を理解しようとしたりする可能性があります.
プレビューに基づいて、DataFrame
API と RDD API の間のどこかに配置できると思います。より柔軟ですDataFrames
が、同様の最適化を提供し、一般的なデータ処理タスクに適しています。RDD API と同じ柔軟性は提供されません (少なくとも Catalyst の内部を深く掘り下げない限り)。
もう 1 つの違いは、現時点では仮説にすぎませんが、ゲスト言語 (R、Python) とのやり取りの方法です。と同様、JVMDataFrame
にDataSet
属します。DataFrame
つまり、考えられる対話は、ネイティブ JVM 操作 (式など) とゲスト側コード (Python UDF など)の 2 つのカテゴリのいずれかに属することができます。残念ながら、2 番目の部分では、JVM とゲスト環境の間の高価な往復が必要です。
以下も参照してください。