通过排除使用 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()
我正在尝试获取数据框中列值不在列表中的所有行(因此通过排除进行过滤)。
举个例子:
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()