2017-03-28 3 views
1

スパークでは、マップを使用する前にフィルタ操作を実行して、マップが可能であることを確認することがよくあります。以下の例を参照してください:スパークの回数とフィルタ

bc_ids = sc.broadcast(ids) 
new_ids = users.filter(lambda x: x.id in ids.value).map(lambda x: ids.value[x]) 

フィルタリングしたユーザーの数を知りたい場合は、どのように効率的に行うことができますか?

count_before = users.count() 
new_ids = users.filter(lambda x: x.id in ids.value).map(lambda x: ids.value[x]) 
count_after = new_ids .count() 

質問が1に関連しているのが、対照的に、スパークSQLに関するものではありません。だから私は使用しないことを好むだろう。

答えて

1

多くの場合、マップを使用する前にフィルタ操作を実行して、 にマップが可能であることを確認します。

map()の前にfilter()を実行する理由は、必要なデータだけを処理するためです。

回答最初のものはあなたにフィルタリングされた結果が得られますし、二行目は、あなたがキャッシュされ、分割されたデータに対して作業しているfiltered.ifあり、これは効果的に行うことができるどのように多くの値があなたを与えるだろう

val base = sc.parallelize(Seq(1, 2, 3, 4, 5, 6, 7))  
println(base.filter { _.==(7) }.count()) 
println(base.filter { !_.==(7) }.count()) 

あなたの質問に。

関連する問題