2016-06-10 9 views
-1

Ich habe die folgenden Arbeits Code:pyspark: halten eine Funktion in der Lambda-Ausdruck

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)) 

Hier row ist from pyspark.sql import Row

aber es ist eine Art von langwierigen und hässlich. Ist es möglich, die replaceNone Funktion zu vermeiden, indem Sie alles direkt in den Lambda-Prozess schreiben? Oder zumindest replaceNone() vereinfachen? Vielen Dank!

+0

im Allgemeinen würde ich sagen, es klingt wie Sie Ihren [Code überprüft] wollen (http: // Codereview .stackexchange.com), aber das ist leicht mit einem einfachen [ternary expression] (http://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator) und Listenverständnis gelöst. –

+0

... was hat das mit irgendetwas zu tun, was ich in der Antwort gesagt oder erwähnt habe? –

Antwort

1

Ich bin mir nicht sicher, was Ihr Ziel ist. Es scheint, wie Sie jsut sind versuchen, alle None Werte in rdd_in mit leeren Zeichenfolgen in jeder Zeile zu ersetzen, wobei in diesem Fall können Sie eine Liste Verständnis verwenden:

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

Der erste Aufruf zur Karte wird eine machen Neue Liste für jedes Element in row und das Listenverständnis werden alle None s durch leere Strings ersetzen.

Dieses auf einem trivialen Beispiel arbeitete (und definiert Karte, da sie nicht für eine Liste definiert wird):

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

was meinst du "Karte ist nicht für eine Liste definiert"? Die eingebaute 'map' nimmt das Callable als erstes Argument und die Sequenz als das zweite Argument. Tauschen Sie einfach die Reihenfolge der Argumente aus und Sie müssen es nicht neu definieren. –

+0

Es ist etwas schwierig, da das Row-Element nicht neu zugewiesen werden kann, row [i] = "" wird nicht funktionieren. – Edamame

+0

@ TadhgMcDonald-Jensen Ich habe vergessen, dass es eine integrierte allgemeine Karte gab. Da du '[1,2,3] .map()' 'nicht aufrufen kannst, habe ich (dumm) gerade eine neue Funktion gemacht. – zephyr1999