Pyspark:根据另一列中包含的字符串过滤数据框(类似SQL的LIKE语句)

10

我尝试按以下方式过滤我的pyspark数据框:有一列包含long_text,另一列包含数字。如果长文本包含该数字,我想要保留该列。 我尝试使用SQL的LIKE语句,但似乎无法应用于另一列(这里是number)。 我的代码如下:

from pyspark.sql.functions import regexp_extract, col, concat, lit
from pyspark.sql.types import *
PN_in_NC = (df
        .filter(df.long_text.like(concat(lit("%"), df.number, lit("%"))))))

我遇到了以下错误:Method like([class org.apache.spark.sql.Column]) does not exist

我尝试了多种方法来解决它(比如在过滤器之前将'%number%'字符串创建为列,不使用lit,使用'%' + number + '%'),但是都没有起作用。如果LIKE不能应用于另一列,是否有其他方法可以实现这个目的?


你可以使用 pyspark.sql.functions.expr 来实现。将列值用作 Spark DataFrame 函数的参数 - pault
1个回答

26

您可以使用contains函数。

from pyspark.sql.functions import *
df1 = spark.createDataFrame([("hahaha the 3 is good",3),("i dont know about 3",2),("what is 5 doing?",5),\
("ajajaj 123",2),("7 dwarfs",1)], ["long_text","number"]) 
df1.filter(col("long_text").contains(col("number"))).show()

长文本列应包含数字列中的数字。

输出:

+--------------------+------+
|           long_text|number|
+--------------------+------+
|hahaha the 3 is good|     3|
|    what is 5 doing?|     5|
|          ajajaj 123|     2|
+--------------------+------+

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