什麼是可以傳遞給SparkContext.parallelize
來創建RDD的元素的限制?更具體地說,如果我使用Python創建自定義類,那麼需要實現哪些方法才能確保它在RDD中正常工作?我假設它需要實施__eq__
和__hash__
並且可以分揀。還有什麼?有關文件的鏈接將不勝感激。我無法找到任何地方。什麼樣的對象可以是Spark RDD中的元素?
1
A
回答
1
嚴格地說,唯一的硬性要求是類是可序列化的(可挑選的),儘管對於生命週期僅限於單個任務(既不混洗也不收集/並行化)的對象來說不是必需的。
一致__hash__
和__eq__
僅需要如果類將(在byKey
操作作爲密鑰)被用作混洗鍵,直接或間接地(例如,用於distinct
或cache
)。
此外,類定義必須可以在每個工作節點上導入,因此模塊必須已經存在於PYTHONPATH
或pyFiles
中。如果類依賴於本地依賴關係,那麼它們也必須存在於每個工作節點上。
最後,對於排序類型,必須使用標準Python語義進行定製。
總結:
無特殊要求,除了被導入的:
class Foo: ... # objects are used locally inside a single task rdd.map(lambda i: Foo(i)).map(lambda foo: foo.get(i))
必須是可序列化:
# Has to be pickled to be distributed sc.parallelize([Foo(1), Foo(2)]) # Has to be pickled to be persisted sc.range(10).map(lambda i: Foo(i)).cache() # Has to be pickled to be fetched to the driver sc.range(10).map(lambda i: Foo(i)).collect() # take, first, etc.
必須是
Hashable
:# Explicitly used as a shuffle key sc.range(10).map(lambda i: (Foo(i), 1)).reduceByKey(add) # *byKey # Implicitly used as a shuffle kye sc.range(10).map(lambda i: Foo(i)).distinct # subtract, etc.
此外,所有通過閉包傳遞的變量都必須是可序列化的。
相關問題
- 1. lxml.Element對象的Spark Python RDD?
- 2. Spark中的RDD樣本
- 3. Spark Streaming DStream元素vs RDD
- 4. 比較RDD對象-Apache Spark
- 5. 從Spark RDD中刪除元素
- 6. 在RDD中查找元素Spark
- 7. 在Apache Spark中緩存RDD的目的是什麼?
- 8. Spark:將RDD元素拆分成塊
- 9. 是否可以在Apache Spark中創建嵌套的RDD?
- 10. 像Spark中現有的RDD一樣分配新的RDD?
- 11. 這是什麼工具欄樣式的可可UI元素?
- 12. 排序RDD元素
- 13. 將RDD的每個元素添加到Spark Scala中另一個RDD的每個元素。
- 14. JSF FileUploadEvent getSource是什麼樣的對象?
- 15. 這是什麼樣的對象樹?
- 16. 將Spark RDD中的元素互相相加
- 17. 對象的值是什麼,什麼時候可以爲空?
- 18. 什麼是更新Spark RDD內部值的有效方法?
- 19. Spark DataSet和RDD有什麼區別
- 20. 爲什麼Spark SQL UDF比RDD慢?
- 21. 迭代RDD元素
- 22. 其他RDD中的Java Spark RDD?
- 23. 以下web元素的XPATH是什麼?
- 24. 什麼是元素的問題對齊
- 25. 什麼是「無內容樣式元素」?
- 26. 使用數組對象計算Spark RDD中的不同文本
- 27. Spark中的metastore是什麼?
- 28. Spark:使用單關鍵RDD加入2元組關鍵RDD的最佳策略是什麼?
- 29. 爲什麼你可以有沒有thead元素的th元素?
- 30. Spark Spark RDD中的字符串替換
非常好,謝謝! –