spark dataframe 对象 filter 函数可以通过指定的条件过滤数据,和 where 函数作用和用法相同,它可以接收字符串类型的 sql 表达式,也可以接受基于 Column 的返回 BooleanType 的列过滤条件。
函数语法
def filter(self, condition):
filter(self, condition) 函数还有一个别名函数 where 函数,该函数是版本 1.3 开始新增的。
-
参数 condition 支持 2 种形式:
基于 Column 的返回 BooleanType 的列过滤条件,如 df.filter(df.ctr >= 0.1)。
也支持字符串类型的 sql 表达式,如 df.filter('id is not null')。
-
返回过滤之后的 dataframe 数据对象。
基本操作
filter 函数接受条件参数,可以是列过滤的 bool 表达式,也可以是字符串的形式 sql 条件。
首先手动创建 dataframe 数据,下面示例都是基于该数据进行演示:
from pyspark.sql import SparkSession
spark_session = SparkSession.builder \
.appName('knowledgedict-dataframe') \
.master('local') \
.getOrCreate()
df = spark_session.createDataFrame(
schema=['id', 'impression', 'click', 'ctr', 'city'],
data=[(1, 100, 5, 0.05, 'beijing'), (None, 10, 3, 0.3, 'beijing'), (3, 50, 5, 0.1, 'shanghai')]
)
df.show()
展示的 df 对象数据如下:
+----+----------+-----+----+--------+------------------+ | id|impression|click| ctr| city| content| +----+----------+-----+----+--------+------------------+ | 1| 100| 5|0.05| beijing| [product]| |null| 10| 3| 0.3| beijing|[product, article]| | 3| 50| 5| 0.1|shanghai| [article, person]| +----+----------+-----+----+--------+------------------+
单列过滤操作
过滤 ctr 大于 0.1 的数据,代码如下:
df.filter(df.ctr >= 0.1).show()
结果如下:
+----+----------+-----+---+--------+------------------+ | id|impression|click|ctr| city| content| +----+----------+-----+---+--------+------------------+ |null| 10| 3|0.3| beijing|[product, article]| | 3| 50| 5|0.1|shanghai| [article, person]| +----+----------+-----+---+--------+------------------+
也可以字符串 sql 表达式进行过滤,示例如下:
df.filter('ctr >= 0.1').show()
多个条件过滤筛选
filter 函数也支持多个条件的过滤筛选,并条件用 and、或用 or,非使用 not 关键字。
过滤 city 为 'beijing' 且 ctr 值大于 0.2 的数据,代码如下:
df.filter("city == 'beijing' and ctr > 0.2").show()
结果如下:
+----+----------+-----+---+-------+------------------+ | id|impression|click|ctr| city| content| +----+----------+-----+---+-------+------------------+ |null| 10| 3|0.3|beijing|[product, article]| +----+----------+-----+---+-------+------------------+
过滤列为非空值的数据
过滤 id 列数据为非空值的数据,代码如下:
df.filter('id is not null').show()
输出如下:
+---+----------+-----+----+--------+-----------------+ | id|impression|click| ctr| city| content| +---+----------+-----+----+--------+-----------------+ | 1| 100| 5|0.05| beijing| [product]| | 3| 50| 5| 0.1|shanghai|[article, person]| +---+----------+-----+----+--------+-----------------+
过滤指定数组包含的条件
获取 ctr 大于等于 0.2 或者 content 数组中包含 'person' 的数据,包含关系的操作可以使用 spark 1.5 时新增的 array_contains 函数,具体代码如下:
df.filter("ctr >= 0.2 or array_contains(content, 'person')").show()
输出如下:
+----+----------+-----+---+--------+------------------+ | id|impression|click|ctr| city| content| +----+----------+-----+---+--------+------------------+ |null| 10| 3|0.3| beijing|[product, article]| | 3| 50| 5|0.1|shanghai| [article, person]| +----+----------+-----+---+--------+------------------+