通过排除使用 isin 过滤 pyspark 数据帧

Filtering a pyspark dataframe using isin by exclusion

我正在尝试获取数据框中列值不在列表中的所有行(因此通过排除进行过滤)。

举个例子:

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 表达式的字符串,或者一次排除一个项目?

编辑:

我可能有一个列表,['a','b'],其中包含我想使用的排除值。

df.filter((df.bar != 'a') & (df.bar != 'b'))

看起来 ~ 提供了我需要的功能,但我还没有找到任何合适的文档。

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



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

也可以这样

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

对于那些在 Pandas 中拥有 headspace 并移动到 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"])]

看起来不错,在我们的 pyspark DataFrame 中

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

所以经过一番挖掘,我发现了这个:https://issues.apache.org/jira/browse/SPARK-20617 因此,在我们的结果中包含 nothingness

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