У меня есть фрейм данных со столбцом со строками, чьи подстроки разделены фиксированным разделителем.Я хотел бы извлечь уникальные подстроки в каждую из этих строк с помощью функции 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](https://i.stack.imgur.com/GQMmv.png)
Так что я не совсем уверен, почему в кадре данных это толькоизвлекает первый матч, а не всю группу.Спасибо за помощь / объяснение!