2016-08-10 58 views
0

我的RDD在其中有TAB分隔的字符串。我試圖對其進行過濾:如果第5列包含弦數:在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]) 

我不認爲它是非常有效的解決方案,因爲我在做4個分割的同一行那裏。有些人可以展示更好的做法嗎?

而如果我有一個「水果」陣列。我如何過濾包含此數組元素的RDD? 可以做類似x.split('\t')[4] in array的東西,但它只會在數組元素等於第5列項時過濾,但是我需要檢查第5列是否包含數組中的任何字符串。

回答

1

你可以用一個「真實」函數替換lambda函數,它將以一種有效的方式做你喜歡的任何事情。 看到一個原型建議的解決方案

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

    return ... 

filt_data = raw_data.filter(efficient_func) 

關於第二個問題的下面 - 我覺得用一個「如果」的說法應該是比使用幾個「如果」語句更好。 例如

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

謝謝!它確實加快了這個過程。關於如何過濾數組內容的第二個問題的任何想法? – lacerated

+0

如果我回答你的問題,請接受它。關於你的第二個問題,我認爲這是一個好主意,應該工作。我已經更新了我的答案以反映該部分。請檢查它是否適用於您。 – Yaron