RDDにmapPartitions
を適用すると、パーティションは反復可能なオブジェクトを取得することに気付きました。 mapPartitions
関数内で、次に、反復可能オブジェクトのtoArray
メンバー関数を呼び出して、その反復可能オブジェクトをArrayオブジェクトに変換します。 toArray
の呼び出しにはコピーが必要ですか、それとも単にメモリと同じ部分を配列として参照するだけですか?コピーが必要な場合は、コピーを防止する方法は何ですか?スパークにおけるイテラブルと配列の関係
4
A
答えて
3
質問に対する重要な修正 - mapPartitions
の間に公開されたパーティションデータ構造はIteratorであり、Iterableではありません。
Iterator
は、一度、コレクションの各要素を訪問することができnext()
とhasNext()
方法を、持っている:ここでは、インタフェースの違いです。イテレータのメソッドが呼び出されると、最後の要素はなくなります(変数に変数を格納していない限り)。Iterable
には、いつでも必要なときにIterator
を生成する機能があります。これにより、必要な回数だけ各要素を訪問することができます。
実装に関しては、Iterator
がデータをストリームスルーできます。実際には、一度に1つの要素しかメモリに格納する必要はありません。next()
が呼び出されるとロードされます。あなたがSpark(sc.textFile
)でテキストファイルを読み込んでいるのであれば、これはまさにこれを行い、メモリをほとんど使いませんので、パーティションを使って単純な繰り返しを行うことができます。
iterator.toArray
に電話することは絶対に許可されていますが、そうしたくないかもしれません。すべてのデータをメモリに格納することになります(一度に1つの要素しかロードできません)。そして、各データをコピーします(プリミティブの場合は、Int
)、またはデータごとに新しい参照を割り当てます(AnyRef
の場合、Array[_]
など)。このコピーを防ぐ方法はありません。
パーティションイテレータを配列に変換することがあなたのやりたいことですが、これらのユースケースはまれです。メモリが不足し、不要な割り当てやGCのためにアプリケーションの処理速度が低下する危険性があるため、実際に必要かどうかを考えてみてください!
関連する問題
- 1. スパークとメタストア関係
- 2. スパークにおける相関行列からペアワイズ相関を抽出する
- 3. ExpressionEngineにおけるHABTMの関係
- 4. CakePHPにおける複数の関係
- 5. スパークとデータフレームとの相関関係を使用するには?
- 6. ApacheのスパークにおけるSortbykey
- 7. ハイブ、スパークSQLとAzure USQLのテーブル関係
- 8. MVCでのOneToMany関係におけるリストとエンティティフレームワーク
- 9. スパーク:配列との結合
- 10. 教義における多くの関係の順序づけ?
- 11. JAVA(DAO)とSQLにおける集約関係
- 12. 巨大な依存関係を避けるスパークを含む
- 13. 配列とのHABTMの関係
- 14. 親子関係の配列
- 15. NULLを持つ列のスパークにおける相関関係を計算するにはどうすればよいですか?
- 16. とValueError(次、イテラブル)
- 17. CakePHPの - 関係のHABTMにおける化合物名で、テーブル
- 18. FHIRにおける患者間の家族関係の表現
- 19. イベントドリブンアーキテクチャにおける複数のイベント依存関係の処理
- 20. Makefileのターゲット依存関係における変数の置換
- 21. 生産におけるAngularjsの依存関係の選択
- 22. ALL関係におけるONに参加する方法
- 23. Entity Frameworkにおける外部キーの関係
- 24. Arquillianにおける推移的依存関係の処理
- 25. Maven - 依存関係管理における複数のアーティファクトバージョン
- 26. Javaプロジェクトにおける依存関係の扱い
- 27. SQLAlchemyにおける複数の自己参照関係
- 28. Boost Pythonにおけるモジュール間の依存関係
- 29. タプル関係計算におけるタプルの重複
- 30. ジャッキー・ユニット・テストにおける角度モジュールの依存関係
次に、私の次の質問は、一度に1つの要素ではなく、特定の数の要素を得ることができますか? – pythonic
これを行うための準備はできていませんが、 'Iterator'を拡張し、最後の' n'要素を追跡することができます。インスピレーションを探しているなら、 'iterator.buffered'を見てください。これは、次の要素を削除せずに見ることができる' BufferedIterator'を構築します。 – Tim
おそらく 'iterator.grouped(size)'が必要です。これは、指定されたサイズの 'Seq'よりもイテレータを与えるでしょう。 –