在PySpark中,当值匹配字符串的一部分时,过滤数据框。

79

我有一个大型的pyspark.sql.dataframe.DataFrame,我想保留(使用filter)所有在location列保存的URL包含预定字符串的行,例如'google.com'。

我已经尝试过:

import pyspark.sql.functions as sf
df.filter(sf.col('location').contains('google.com')).show(5)

但是这会抛出一个异常:

TypeError: _TypeError: 'Column' object is not callable'

我如何在DataFrame中进行筛选并正确过滤?

4个回答

156

从 Spark 2.2 版本开始

df.filter(df.location.contains('google.com'))

Spark 2.1 及之前版本

你可以在 filter 中使用纯 SQL。

Spark 2.2 文档链接

df.filter("location like '%google.com%'")

或者使用DataFrame列方法

df.filter(df.location.like('%google.com%'))

Spark 2.1 文档链接


嗨,Srinivas,如果我们需要检查两个单词,比如google.comamazon.com,使用like该怎么做呢?我们应该怎么做? - cph_sto
3
有多种方法可以完成这个任务。SQL 方式为 df.filter("location like '%google.com%' AND location like '%amazon.com%'"),而使用 DataFrame 方式则为 df.filter("location like '%google.com%'").filter("location like '%amazon.com%'") - mrsrinivas
1
@mrsrinivas,如果我们想要在所有列中搜索“像'ID'”,该怎么办?例如,数据框应该包含包含单词“ID”的所有列。 - jgtrz
1
对于多个子字符串,可以使用rlike和join来过滤数据框,例如:df.filter(F.col("yourcol").rlike('|'.join(substrings))),其中substrings是一个子字符串列表,如substrings = ['google.com','amazon.com'] - anky

23

1
如何在 .contains() 中输入多个字符串? - Scope

8

在对一个包含字符串的DataFrame进行筛选时,如果数据中的列项可能为"foo"和"Foo"等,pyspark.sql.functions包中的lowerupper函数非常有用。

import pyspark.sql.functions as sql_fun
result = source_df.filter(sql_fun.lower(source_df.col_name).contains("foo"))

0
您可以尝试以下表达式,它可以帮助您同时搜索多个字符串:

df.filter(""" location rlike 'google.com|amazon.com|github.com' """)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接