如何使用现有的pySpark sql函数在字符串列中查找非消费正则表达式模式?
下面的代码是可重现的,但没有给出预期的结果。
import pyspark
from pyspark.sql import (
SparkSession,
functions as F)
spark = (SparkSession.builder
.master('yarn')
.appName("regex")
.getOrCreate()
)
sc = spark.sparkContext
sc.version # u'2.2.0'
testdf = spark.createDataFrame([
(1, "Julie", "CEO"),
(2, "Janice", "CFO"),
(3, "Jake", "CTO")],
["ID", "Name", "Title"])
ptrn = '(?=Ja)(?=ke)'
testdf.withColumn('contns_ptrn', testdf.Name.rlike(ptrn) ).show()
+---+------+-----+-----------+
| ID| Name|Title|contns_ptrn|
+---+------+-----+-----------+
| 1| Julie| CEO| false|
| 2|Janice| CFO| false|
| 3| Jake| CTO| false|
+---+------+-----+-----------+
testdf.withColumn('contns_ptrn', F.regexp_extract(F.col('Name'), ptrn, 1)).show()
+---+------+-----+-----------+
| ID| Name|Title|contns_ptrn|
+---+------+-----+-----------+
| 1| Julie| CEO| |
| 2|Janice| CFO| |
| 3| Jake| CTO| |
+---+------+-----+-----------+
testdf.withColumn('contns_ptrn', F.regexp_replace(F.col('Name'), ptrn, '')).show()
+---+------+-----+-----------+
| ID| Name|Title|contns_ptrn|
+---+------+-----+-----------+
| 1| Julie| CEO| Julie|
| 2|Janice| CFO| Janice|
| 3| Jake| CTO| Jake|
+---+------+-----+-----------+
预期的结果将是:
+---+------+-----+-----------+
| ID| Name|Title|contns_ptrn|
+---+------+-----+-----------+
| 1| Julie| CEO| false|
| 2|Janice| CFO| false|
| 3| Jake| CTO| true|
+---+------+-----+-----------+
因为名称列中的第三行包含'Ja‘和'ke’。
如果regexp_extract
或regexp_replace
能够提取或替换非消耗的正则表达式模式,那么我还可以将它们与length
一起使用来获得布尔列。
发布于 2019-05-17 07:50:37
找到了一个快速的解决方案,希望这能帮助其他人。
将ptrn
从'(?=Ja)(?=ke)'
更改为'(?=.*Ja)(?=.*ke)'
,rlike
即可正常工作。
这个答案让我很接近,但却导致了我的问题。https://stackoverflow.com/a/469951/5060792
这些答案解决了我的问题。https://stackoverflow.com/a/3041326 https://stackoverflow.com/a/470602/5060792
顺便说一句,除了对ptrn
的更改之外,regexp_extract
抛出了一个java.lang.IndexOutOfBoundsException: No group 1
异常。在将整个模式放在括号ptrn = '((?=.*Ja)(?=.*ke))'
中之后,它返回空值。
同样,regexp_replace
不替换任何内容,并返回原始值。
https://stackoverflow.com/questions/56177846
复制相似问题