2017-07-28 84 views
0

我有以下代碼Spark:爲什麼我的UDF沒有在rdd映射中調用?

def get_general_popularity_count(): 
    def test(t): 
     a = 1 # this is just a random variable for testing 
     print "a" 
     pickle.dump(a, open("a.p", "wb")) 
    count_dict = pickle.load(open("list.p","rb")) 
    rdd = session.sparkContext.parallelize(count_dict) 
    rdd.map(lambda x:test(x)) 

但是,沒有打印,鹹菜沒有保存文件要麼。事實上,我知道UDF從來沒有被調用,因爲一旦我在test(x)中有語法錯誤,但程序從未捕獲它。
那麼爲什麼我的UDF永遠不會打電話?任何幫助表示讚賞

回答

1

它不會被調用,因爲map是一種轉換。除非後面跟着一個動作,否則Spark根本沒有理由執行它。

而且你的代碼是不是Apache的星火一個不錯的選擇:

  • print輸出數據到工人的標準輸出。
  • pickle.dump將寫入工作人員的本地文件系統,並在執行像map這樣的操作時,再次覆蓋輸出。

你可以嘗試RDD.foreachRDD.saveAsPickleFile

+0

非常感謝你。從我從文檔中看到,foreach在每個集羣上執行,所以如果我有一個本地字典,並且我想在rdd中的每一行上運行某種函數,然後將其添加到字典中,那麼這將如何工作? – Pear

相關問題