2016-08-10 10 views
0

私のRDDには、TABで区切られた文字列があります。私はそれをフィルタ処理しようとしている:私はそこに同じ行の4つの分割をやっているので、私はその非常に効果的な解決策を考えていけない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]) 

:列5は、いくつかの文字列が含まれている場合。いくつか、それを行うより最適な方法を示すことができますか?

「果物」の配列がある場合はどうなりますか?この配列の要素を含むRDDをどのようにフィルタリングできますか? x.split('\t')[4] in arrayのようなことができますが、配列要素が列5の項目と等しい場合にのみフィルタリングされますが、列5に配列のいずれかの文字列が含まれているかどうかを確認する必要があります。

答えて

1

ラムダ関数を、あなたが好きなものを効率的に実行する「本当の」関数に置き換えることができます。 第二の問題に関して提案された解決策

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

    return ... 

filt_data = raw_data.filter(efficient_func) 

のプロトタイプの下を参照してください - 私は1つを使用すると、「あれば」文は、いくつかの「if」ステートメントを使用するよりも良いはずだと思います。例:

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

ありがとうございます!それはプロセスをスピードアップしました。どのように配列の内容でフィルタリングするための第二の質問についての任意のアイデア? – lacerated

+0

私があなたの質問に答えたら、それを受け入れてください。あなたの2番目の質問については、それは良いアイデアだと思うし、うまくいくはずです。私はその部分を反映するために私の答えを更新しました。それがあなたのために働くかどうか確認してください。 – Yaron