2017-12-12 15 views
0

です。私はRDDで作業していたいくつかのプロジェクトの後にデータセットを扱うようになっています。私は開発のためにJavaを使用しています。データセットでwithColumnを呼び出すコストは

私の知る限り、列は不変です。列のマップ機能はありません。列をマップする標準的な方法では、withColumnという列を追加しています。

私の質問はwithColumnを呼び出すと本当に何が起こっているのですか?パフォーマンスのペナルティはありますか?私は可能な限り少ない数の電話をwithColumnにしようとするべきですか、それとも問題ありませんか?

質問:私が爆発やピボットなどの他の行/列作成機能を呼び出すと、パフォーマンス上のペナルティはありますか?

+0

withColumnでは、ほとんどありません。メタデータの変更です。ピボットは、データセットをグループ分けしてから使用することができ、高価になります。 – philantrovert

+0

Spark 2.2より前のSpark 2では、爆発が非常に遅くなる可能性があります。https://issues.apache.org/jira/browse/SPARK-21657 –

答えて

1

DataFrameとやりとりするさまざまな機能のパフォーマンスは、問題が発生しない(または実際に気づく)ほど速いです。

これは、ドライバで定義したトランスフォーメーションをスパークがどのように実行するかを理解すれば、より意味があります。さまざまな変換関数(、列、選択など)を呼び出すと、実際には何も実行されません。実行計画に実行する操作を登録するだけです。 アクションを呼び出すまで、Sparkはデータの計算を開始しません。通常、結果を取得したり、データを書き出したりします。

実行したいすべての操作がわかっていると、実際に実行する前に実行計画の最適化を実行できます。たとえば、withColumnを使用して新しい列を作成した後、データをファイルに書き出す前にその列を削除するとします。 Sparkは実際にその列を計算する必要はないことを知っています。一般的に、あなたのドライバの性能を決定します

ものがあります:

  1. があるとどのくらいのデータ
  2. をシャッフルしている私がいずれかを持っていますどのように多くの広い変換(キュータの間でデータのシャッフル)高価な変換が爆発し、ピボットについてあなたの余分な質問について

を機能:

  • Explodeは新しい行を作成しますが、狭い変換です。エグゼキュータ間でデータを移動することなく、パーティションを変更することができます。これは、実行するのが比較的安価であることを意味します。コメントにRaphaelが指摘しているように、あなたが非常に大きな配列を持っている場合は例外です。
  • ピボットには、ワイド変換であるgroupBy操作が必要です。指定されたキーのすべてのデータが同じパーティションに確実に存在するように、すべてのエグゼキュータから他のすべてのエグゼキュータにデータを送信する必要があります。余分なネットワークトラフィックが必要なため、これは高価な操作です。
+0

「浅い」「狭い」と思いますか?浅い変換について聞いたことはありません..... Spark 2.0/2.1の大規模な配列(https://issues.apache.org/jira/browse/SPARK-16998およびhttps:// issues)では、爆発が非常に非効率的であることに注意してください。apache.org/jira/browse/SPARK-21657 –

+0

ええ、浅いのはタイプミスでした。これは修正され、あなたの爆発コメントを含むように更新されました。ありがとう! – RyanW

関連する問題