Pyspark: фильтровать фрейм данных, если столбец содержит строку из другого столбца (оператор SQL LIKE) - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь отфильтровать мой фрейм данных 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%' в виде столбца перед фильтром, не используя lit, using '%' + number + '%'), но ничего не получалось.Если LIKE нельзя применить к другому столбцу, есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете использовать функцию 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 должен содержать число в столбце номера.

Выход:

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