在 PySpark 中对多个单词使用 LIKE 运算符
Posted
技术标签:
【中文标题】在 PySpark 中对多个单词使用 LIKE 运算符【英文标题】:Using LIKE operator for multiple words in PySpark 【发布时间】:2018-10-19 09:35:19 【问题描述】:我在PySpark
中有一个 DataFrame df
,如下图所示 -
+-----+--------------------+-------+
| ID| customers|country|
+-----+--------------------+-------+
|56 |xyz Limited |U.K. |
|66 |ABC Limited |U.K. |
|16 |Sons & Sons |U.K. |
|51 |TÜV GmbH |Germany|
|23 |Mueller GmbH |Germany|
|97 |Schneider AG |Germany|
|69 |Sahm UG |Austria|
+-----+--------------------+-------+
我只想保留ID
从 5 或 6 开始的那些行。所以,我希望我的最终数据框看起来像这样 -
+-----+--------------------+-------+
| ID| customers|country|
+-----+--------------------+-------+
|56 |xyz Limited |U.K. |
|66 |ABC Limited |U.K. |
|51 |TÜV GmbH |Germany|
|69 |Sahm UG |Austria|
+-----+--------------------+-------+
这可以通过多种方式实现,这不是问题。但是,我有兴趣了解如何使用LIKE
语句来完成此操作。
如果我只对ID
从 5 开始的那些行感兴趣,它可以像这样轻松完成 -
df=df.where("ID like ('5%')")
我的问题:如何在 where
子句中添加第二条语句,如 "ID like ('6%')"
和 OR - |
布尔值?我想做如下所示的事情,但是这段代码出错了。所以,简而言之,我如何在此处使用 LIKE and .where
使用多个布尔语句 -
df=df.where("(ID like ('5%')) | (ID like ('6%'))")
【问题讨论】:
【参考方案1】:你可以试试
df = df.where('ID like "5%" or ID like "6%"')
【讨论】:
非常感谢平图。你能告诉我为什么把 ' 换成 " 会成功吗? 诀窍是使用或代替|。交换 ' 没有任何影响。 哦,我以为我们必须使用管道 |在 PySpark 和 or 中是不允许的。很惊讶。 pyspark where 语句同时支持数据帧操作和 sql 查询。您(甚至我)使用的那个是 where 中的 sql。因此,这里支持 or 语句。 Mike 建议使用数据框操作,您不能使用 或。 我也认为它可能与 SQL 类型语法有关,而不是与 DataFrame 语法有关。非常感谢平图。很有帮助。【参考方案2】:这对我有用
from pyspark.sql import functions as F
df.where(F.col("ID").like('5%') | F.col("ID").like('6%'))
【讨论】:
【参考方案3】:在pyspark中,SparkSql语法:
where column_n like 'xyz%' OR column_n like 'abc%'
可能不行。
用途:
where column_n RLIKE '^xyz|abc'
说明:它将过滤所有以abc
或xyz
开头的单词。
这很好用。
【讨论】:
嗨,“喜欢”对我来说也很完美,而且代码没有损坏。所以,我会继续这样做。感谢您的 cmets。 @cph_sto :是的,它可能适用于少数情况,但在您使用变量替换的情况下,例如 where column_m='%(some_variable)s' 。如果您使用 like 运算符和 % 以及此变量替换然后它将破坏代码,因为 python 会与 % 混淆以上是关于在 PySpark 中对多个单词使用 LIKE 运算符的主要内容,如果未能解决你的问题,请参考以下文章