web-dev-qa-db-ja.com

除外によるisinを使用したpysparkデータフレームのフィルタリング

列値がリスト内にないデータフレーム内のすべての行を取得しようとしています(つまり、除外によるフィルタリング)。

例として:

df = sqlContext.createDataFrame([('1','a'),('2','b'),('3','b'),('4','c'),('5','d')]
,schema=('id','bar'))

データフレームを取得します。

+---+---+
| id|bar|
+---+---+
|  1|  a|
|  2|  b|
|  3|  b|
|  4|  c|
|  5|  d|
+---+---+

Barが( 'a'または 'b')の行のみを除外します。

SQL式文字列を使用すると、次のようになります。

df.filter('bar not in ("a","b")').show()

SQL式に文字列を使用せずに、または一度に1つの項目を除外せずにそれを行う方法はありますか?

編集:

使用したい除外値のリスト['a'、 'b']があると思います。

22
gabrown86

〜に必要な機能が備わっているようですが、適切なドキュメントはまだ見つかっていません。

df.filter(~col('bar').isin(['a','b'])).show()



+---+---+
| id|bar|
+---+---+
|  4|  c|
|  5|  d|
+---+---+
50
gabrown86

また、このようにすることができます

df.filter(col('bar').isin(['a','b']) == False).show()
23
Alezis

Pandasにヘッドスペースがあり、pysparkに移動している人のための落とし穴を手に入れました

 from pyspark import SparkConf, SparkContext
 from pyspark.sql import SQLContext

 spark_conf = SparkConf().setMaster("local").setAppName("MyAppName")
 sc = SparkContext(conf = spark_conf)
 sqlContext = SQLContext(sc)

 records = [
     {"colour": "red"},
     {"colour": "blue"},
     {"colour": None},
 ]

 pandas_df = pd.DataFrame.from_dict(records)
 pyspark_df = sqlContext.createDataFrame(records)

したがって、赤ではない行が必要な場合赤:

pandas_df[~pandas_df["colour"].isin(["red"])]

As expected in Pandas

見栄えが良く、pyspark DataFrame

pyspark_df.filter(~pyspark_df["colour"].isin(["red"])).collect()

Not what I expected

だからいくつかの掘り下げの後、私はこれを見つけました: https://issues.Apache.org/jira/browse/SPARK-20617 だから含めるnothingness結果:

pyspark_df.filter(~pyspark_df["colour"].isin(["red"]) | pyspark_df["colour"].isNull()).show()

much ado about nothing

13
df.filter((df.bar != 'a') & (df.bar != 'b'))
11
Assaf Mendelson