Pyspark:如果列包含来自另一列的字符串,则过滤数据框(SQL LIKE语句)

时间:2019-02-25 12:17:28

标签: python apache-spark pyspark sql-like

我试图通过以下方式过滤pyspark数据帧:我有一列包含long_text,另一列包含数字。如果长文本包含number,我想保留该列。 我正在尝试使用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%'字符串创建为列,而不使用litusing '%' + number + '%'),但是没有任何效果。如果无法将LIKE应用于另一列,是否还有另一种方法?

1 个答案:

答案 0 :(得分:2)

您可以使用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列中包含数字。

输出:

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