Как отфильтровать столбец в фрейме данных по значению регулярного выражения другого столбца в том же фрейме данных в Pyspark - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь отфильтровать столбец в фрейме данных, который соответствует шаблону регулярного выражения, указанному в другом столбце

df = sqlContext.createDataFrame([('what is the movie that features Tom Cruise','actor_movies','(movie|film).*(feature)|(in|on).*(movie|film)'),
    ('what is the movie that features Tom Cruise','artist_song','(who|what).*(sing|sang|perform)'),
    ('who is the singer for hotel califonia?','artist_song','(who|what).*(sing|sang|perform)')],  
['query','question_type','regex_patt'])

+--------------------+-------------+----------------------------------------- -+
|               query                   |question_type  |regex_patt|
+--------------------+-------------+----------------------------------------------+
|what movie features Tom Cruise         | actor_movies  | (movie|film).*(feature)|(in|on).*(movie|film)
|what movie features Tom Cruise         | artist_song   | (who|what).*(sing|sang|perform)
|who is the singer for hotel califonia  | artist_song   | (who|what).*(sing|sang|perform) |
 +--------------------+-------------+------------------------------------------------+

Я хочу обрезать фрейм данных таким образом, чтобы сохранить только те строки, запрос которых соответствует столбцу regex_pattern value.
Окончательный результат должен выглядеть следующим образом

+--------------------+-------------+----------------------------------------- -+
|               query                   |question_type  |regex_patt|
+--------------------+-------------+----------------------------------------------+
|what movie features Tom Cruise         | actor_movies  | (movie|film).*(feature)|(in|on).*(movie|film)|
|who is the singer for hotel califonia  | artist_song   | (who|what).*(sing|sang|perform) 
 +--------------------+-------------+------------------------------------------------+

Я думал о

df.filter(column('query').rlike('regex_patt'))

Но rlike принимает только строки регулярных выражений.

Теперь вопрос в том, как отфильтровать столбец "query" на основе значения регулярного выражения столбца "regex_patt"?

1 Ответ

2 голосов
/ 02 марта 2020

Вы можете попробовать это. Выражение позволяет вам помещать столбцы как str и pattern.

from pyspark.sql import functions as F
df.withColumn("query1", F.expr("""regexp_extract(query, regex_patt)""")).filter(F.col("query1")!='').drop("query1").show(truncate=False)

+------------------------------------------+-------------+---------------------------------------------+
|query                                     |question_type|regex_patt                                   |
+------------------------------------------+-------------+---------------------------------------------+
|what is the movie that features Tom Cruise|actor_movies |(movie|film).*(feature)|(in|on).*(movie|film)|
|who is the singer for hotel califonia?    |artist_song  |(who|what).*(sing|sang|perform)              |
+------------------------------------------+-------------+---------------------------------------------+
...