gab*_*n86 21 python apache-spark pyspark pyspark-sql
我试图获取数据框中的所有行,其中列值不在列表中(因此通过排除进行过滤).
举个例子:
df = sqlContext.createDataFrame([('1','a'),('2','b'),('3','b'),('4','c'),('5','d')]
,schema=('id','bar'))
Run Code Online (Sandbox Code Playgroud)
我得到了数据框:
+---+---+
| id|bar|
+---+---+
| 1| a|
| 2| b|
| 3| b|
| 4| c|
| 5| d|
+---+---+
Run Code Online (Sandbox Code Playgroud)
我只想排除bar所在的行('a'或'b').
使用SQL表达式字符串,它将是:
df.filter('bar not in ("a","b")').show()
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用SQL表达式的字符串或一次排除一个项目的情况下执行此操作?
编辑:
我可能有一个列表,['a','b'],我想要使用的排除值.
gab*_*n86 48
看起来〜给出了我需要的功能,但我还没有找到任何适当的文档.
df.filter(~col('bar').isin(['a','b'])).show()
+---+---+
| id|bar|
+---+---+
| 4| c|
| 5| d|
+---+---+
Run Code Online (Sandbox Code Playgroud)
Ale*_*zis 22
也可能是这样的
df.filter(col('bar').isin(['a','b']) == False).show()
Run Code Online (Sandbox Code Playgroud)
小智 12
对于那些在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)
Run Code Online (Sandbox Code Playgroud)
所以如果我们想要不是红色的行:
pandas_df[~pandas_df["colour"].isin(["red"])]
Run Code Online (Sandbox Code Playgroud)
看起来不错,在我们的pyspark DataFrame中
pyspark_df.filter(~pyspark_df["colour"].isin(["red"])).collect()
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘,我发现了这个:https://issues.apache.org/jira/browse/SPARK-20617 所以要在我们的结果中包含虚无:
pyspark_df.filter(~pyspark_df["colour"].isin(["red"]) | pyspark_df["colour"].isNull()).show()
Run Code Online (Sandbox Code Playgroud)