2017-02-10 7 views
1

私はpysparkを使用しています。私は、そのcol1ある整数と私は整数spark use "set in"句でデータフレームをフィルタリングする

S1 = [1,2,3,4] 

のリストを事前に定義その後、私はセットS1col1my_sdf内の行を返したいスパークデータフレームmy_sdfを持っています。だから私は、次のようでした:

Test1 = my_sdf.filter(my_sdf.col1 in S1).cache() 
# or Test1 = my_sdf.filter(my_sdf.col1 not in S1).cache() 
Test1.count() 

しかし、それは

とValueErrorを返しますブール値に列を変換できません:は「&」を使用「と」、してください「|」 DataFrameのブール式を構築するときは 'or'、 '〜'は 'not'です。

この問題の解決方法はわかりません。最終的には、S1 = []を私の反復の開始点として空リストにしたいと思います。ループ中にS1を更新します。同様に、not in S1も機能しません。私はそれが動作

Test1 = my_sdf.filter((my_sdf.col1 <10) & (my_sdf.col1>2)).cache() 

書き込みしようとしましたが、私はフィルタリング条件in S1を使用している場合、それは動作しません。

もう1つ質問があります:これは何をcache()ものしていますか?私はそれを置かないと違いが出るのだろうか?私は火花がコードを評価するためにlazyであると言われましたので、私がTest.count()を呼び出す前に、それは実際には前のフィルタリングコマンドを実行しません。しかし、私はこの正確なcache()がどれほど正確であるか分かりません。

答えて

1

あなたはあなたの問題のために

ISIN使用することができ、あなたはこのような何かを試すことができます。私の理解に基づいて

from pyspark.sql.functions import col

Test1 = my_sdf.where(col("col1").isin(S1))

、キャッシュは現在の値を保存するために使用されますあなたのデータフレームの。そのデータフレームを再び使用したい場合、sparkはキャッシュから値を取り込み、最初から再度計算するのではないので便利です。だから、あなたのコードがTest1.countしか行っていなければ、キャッシュするかどうかは問題になりません。 CMIIW

+1

ありがとうございました!私はそれを使って演奏しました。私は 'not in'のために見つけたので、my_sdf.where(col( "col1")。isin(S1))&(〜col( "col1")。isin(S2))を使うことができました。 ) ' – ftxx

+0

私が持っていたもう一つの質問は、' S1'がpythonリストではなく '[Row(S = 9527)、Row(S = 36)]'のような列を持つpysparkデータフレームこの 'isin'関数は動作しません。あなたはまだそれを動作させるように考えていますか? – ftxx

関連する問題