PySpark регулярное выражение соответствия между таблицами - PullRequest
0 голосов
/ 22 января 2019

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

columns = ['id', 'text']
vals = [
 (1, 'here is a Match1'),
 (2, 'Do not match'),
 (3, 'Match2 is another example'),
 (4, 'Do not match'),
 (5, 'here is a Match1')
]

df_to_extract = sql.createDataFrame(vals, columns)


columns = ['id', 'Regex', 'Replacement']
vals = [
(1, 'Match1', 'Found1'),
(2, 'Match2', 'Found2'),
]

df_regex = sql.createDataFrame(vals, columns)

Я бы хотел сопоставить столбец 'Regex' в тексте 'text'столбец 'df_to_extract'.Я хотел бы извлечь термины для каждого идентификатора с помощью результирующей таблицы, содержащей идентификатор и «замена», что соответствует «регулярному выражению».Например:

+---+------------+
| id| replacement|
+---+------------+
|  1|      Found1|
|  3|      Found2|
|  5|      Found1|
+---+------------+

Спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Один из способов - использовать pyspark.sql.functions.expr, что позволяет использовать значение столбца в качестве параметра в вашем условии соединения.

Например,:

from pyspark.sql.functions import expr
df_to_extract.alias("e")\
    .join(
        df_regex.alias("r"), 
        on=expr(r"e.text LIKE concat('%', r.Regex, '%')"),
        how="inner"
    )\
    .select("e.id", "r.Replacement")\
    .show()
#+---+-----------+
#| id|Replacement|
#+---+-----------+
#|  1|     Found1|
#|  3|     Found2|
#|  5|     Found1|
#+---+-----------+

Здесь я использовал выражение sql:

e.text LIKE concat('%', r.Regex, '%')

, которое объединит все строки, где столбец text похож на столбец Regex с действующим %в качестве подстановочных знаков для захвата чего-либо до и после.

...