Pyspark.sql regexp_extract не возвращает полную группу - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть фрейм данных со столбцом со строками, чьи подстроки разделены фиксированным разделителем.Я хотел бы извлечь уникальные подстроки в каждую из этих строк с помощью функции Pyspark.sql regexp_extract.Во-первых, позвольте мне создать воспроизводимый пример:

import pyspark.sql.functions as F    
import random
random.seed(1)

df = sc.parallelize([(
    random.choice(["a", "b", "c"]),
    random.choice(["foo", "bar", "fool"]),
) for _ in range(100)]).toDF(["c1", "c2"])

df2 = (df
       .groupBy("c1")
       .agg(F.concat_ws("; ", F.collect_list(F.col("c2"))).alias("c2"))
       )

Теперь я пытаюсь получить уникальные подстроки в новый столбец

df3 = df2.withColumn("c3",
                     F.regexp_extract(
                        "c2",
                        # unique substrings separated by semicolons
                        "(?<=\s|^)([^;]+)(?=;|$)(?!.*\b\1\b)",
                        1
                        )
                     )

Но регулярное выражение возвращает только первое совпадение вгруппа:

+---+--------------------+---+
| c1|                  c2| c3|
+---+--------------------+---+
|  c|bar; bar; bar; ba...|bar|
|  b|bar; bar; bar; ba...|bar|
|  a|bar; bar; bar; ba...|bar|
+---+--------------------+---+

Строка регулярного выражения должна быть в порядке, судя по этому: Testing the regex at Regex101

Так что я не совсем уверен, почему в кадре данных это толькоизвлекает первый матч, а не всю группу.Спасибо за помощь / объяснение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...