2016-08-10 125 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