Spark 教程

Spark SQL

Spark 笔记

Spark MLlib

spark dataframe filter 函数过滤操作方法全解

Spark DataFrame 原理及操作详解 Spark DataFrame 原理及操作详解


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]|
+----+----------+-----+---+--------+------------------+