过滤在pyspark

时间:2016-08-10 10:17:26

标签: python apache-spark pyspark

我的RDD中有TAB分隔的字符串。我正在尝试过滤它:如果第5列包含很少的字符串:

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行同一行。 some1可以显示更优化的方式吗?

如果我有一系列“水果”怎么办?如何过滤包含此数组元素的RDD? 可以执行类似x.split('\t')[4] in array的操作,但只有在数组元素等于第5列项时才会进行过滤,但我需要检查第5列是否包含数组中的任何字符串。

1 个答案:

答案 0 :(得分: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)

关于第二个问题 - 我认为使用一个“if”语句应该比使用几个“if”语句更好。 e.g。

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