2016-08-10 5 views
0

Meine RDD hat TAB-Zeichenfolgen darin enthalten. Ich versuche, es zu filtern: wenn Spalte 5 paar Strings enthält:Filterung in pyspark

filt_data = raw_data.filter(lambda x: '' if len(x.split('\t')) < 5 else "apple" in x.split('\t')[4] or "pear" in x.split('\t')[4] or "berry" in x.split('\t')[4] or "cherry" in x.split('\t')[4]) 

Ich denke, seine sehr effektive Lösung nicht, da ich es tue 4 Splits der gleichen Reihe. Kann some1 einen optimalen Weg zeigen?

Und was ist, wenn ich eine Reihe von "Früchten" habe. Wie kann ich meine RDD filtern, die Elemente von diesem Array enthält? Könnte so etwas tun x.split('\t')[4] in array aber es wird nur filtern, wenn ein Array-Element gleich ist Spalte 5 Element, aber ich muss überprüfen, ob Spalte 5 eine der Strings in Array enthält.

Antwort

1

Sie können die Lambda-Funktion durch eine "echte" Funktion ersetzen, die auf effiziente Weise funktioniert. unter einen Prototyp der vorgeschlagenen Lösung Siehe

def efficient_func(line): 
    if len(x.split('\t')) < 5: 
     return '' 
    word = line.split('\t')[4] 
    ... 

    return ... 

filt_data = raw_data.filter(efficient_func) 

In Bezug auf die zweite Frage - ich glaube, dass man mit „if“ Anweisung besser sein sollten mehrere „wenn“ Aussagen als verwenden. z.B.

fruits_array = ['apple','pear','berry','cherry'] 
if word in fruits_array: 
    do_something (or return some_value) 
+0

Danke! Es hat den Prozess beschleunigt. Irgendeine Idee über die zweite Frage, wie man nach Array-Inhalten filtert? – lacerated

+0

Wenn ich deine Frage beantwortet habe, akzeptiere sie bitte. in Bezug auf Ihre zweite Frage, denke ich, dass es eine gute Idee ist, und sollte funktionieren. Ich habe meine Antwort aktualisiert, um diesen Teil auch wiederzugeben. Bitte überprüfen Sie, ob es für Sie funktioniert. – Yaron