2016-06-10 256 views
-1

我有以下工作代碼:pyspark:保持功能的lambda表達式

def replaceNone(row): 
    myList = [] 
    row_len = len(row) 
    for i in range(0, row_len): 
    if row[i] is None: 
     myList.append("") 
    else: 
     myList.append(row[i]) 
    return myList 

rdd_out = rdd_in.map(lambda row : replaceNone(row)) 

這裏rowfrom pyspark.sql import Row

然而,這是一種冗長和醜陋。是否可以通過直接在lambda進程中寫入所有內容來避免編寫replaceNone函數?或者至少簡化replaceNone()?謝謝!

+0

通常我會說這聽起來像你希望你的[代碼審查(HTTP://代碼審查.stackexchange.com),但這很容易通過一個簡單的[三元表達式](http://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator)和列表理解來解決。 –

+0

...這與我在收到的答案中提到或提到的任何內容有什麼關係? –

回答

1

我不確定你的目標是什麼。好像你僅僅指剛試圖取代rdd_in空字符串的所有各行的None值,在這種情況下,你可以使用列表理解:

rdd_out = rdd_in.map(lambda row: [r if r is not None else "" for r in row])

第一次調用映射將使row中的每個元素的新列表,列表理解將用空字符串替換所有None

這個工作在一個簡單的例子(和定義地圖,因爲它不是一個列表中定義):

def map(l, f): 
    return [f(r) for r in l] 

l = [[1,None,2],[3,4,None],[None,5,6]] 
l2 = map(l, lambda row: [i if i is not None else "" for i in row]) 

print(l2) 
>>> [[1, '', 2], [3, 4, ''], ['', 5, 6]] 
+1

你是什麼意思「地圖沒有爲列表定義」?內置的'map'將callable作爲第一個參數,序列作爲第二個,只是交換參數的順序,而不需要重新定義它。 –

+0

由於Row元素無法重新分配,因此行[i] =「」不起作用,這有點棘手。 – Edamame

+0

@ TadhgMcDonald-Jensen我忘記了內置的一般地圖。既然你不能調用'[1,2,3] .map()'我(愚蠢)只是做了一個新的函數。 – zephyr1999