2015-12-15 41 views
1

我寫使用如何從PySpark中的地圖方法返回空(null?)項目?

RDD.map(lambda line: my_method(line)) 

並且基於my_method特定條件(假設符合「A」開頭)的映射方法,我想要麼返回一個特定的值,否則都在一起忽略該項。

現在,我返回-1,如果條件未在項目遇到了,然後再使用另一

RDD.filter() method to remove all the ones with -1. 

什麼更好的辦法能夠通過從my_method返回null忽略這些項目嗎?

回答

6

如果這樣flatMap是您的朋友:

  1. 調整my_method所以它返回單個元素的列表或空列表(或創建一個像這裏What is the equivalent to scala.util.Try in pyspark?包裝)

    def my_method(line): 
        return [line.lower()] if line.startswith("a") else [] 
    
  2. flatMap

    rdd = sc.parallelize(["aDSd", "CDd", "aCVED"]) 
    
    rdd.flatMap(lambda line: my_method(line)).collect() 
    ## ['adsd', 'acved'] 
    
2

如果您想忽略基於某些條件的項目,那麼爲什麼不自己使用filter?爲什麼要使用地圖?如果您想對其進行轉換,則可以在濾鏡的輸出中使用貼圖。

0

filter是變換方法。由於創建新的RDD,這是高成本的操作。