首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在pySpark sql函数中使用非消耗正则表达式

在pySpark sql函数中使用非消耗正则表达式
EN

Stack Overflow用户
提问于 2019-05-17 07:36:49
回答 1查看 374关注 0票数 0

如何使用现有的pySpark sql函数在字符串列中查找非消费正则表达式模式?

下面的代码是可重现的,但没有给出预期的结果。

代码语言:javascript
复制
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"])
代码语言:javascript
复制
ptrn = '(?=Ja)(?=ke)'
代码语言:javascript
复制
testdf.withColumn('contns_ptrn', testdf.Name.rlike(ptrn) ).show()
代码语言:javascript
复制
+---+------+-----+-----------+
| ID|  Name|Title|contns_ptrn|
+---+------+-----+-----------+
|  1| Julie|  CEO|      false|
|  2|Janice|  CFO|      false|
|  3|  Jake|  CTO|      false|
+---+------+-----+-----------+
代码语言:javascript
复制
testdf.withColumn('contns_ptrn', F.regexp_extract(F.col('Name'), ptrn, 1)).show()
代码语言:javascript
复制
+---+------+-----+-----------+
| ID|  Name|Title|contns_ptrn|
+---+------+-----+-----------+
|  1| Julie|  CEO|           |
|  2|Janice|  CFO|           |
|  3|  Jake|  CTO|           |
+---+------+-----+-----------+
代码语言:javascript
复制
testdf.withColumn('contns_ptrn', F.regexp_replace(F.col('Name'), ptrn, '')).show()
代码语言:javascript
复制
+---+------+-----+-----------+
| ID|  Name|Title|contns_ptrn|
+---+------+-----+-----------+
|  1| Julie|  CEO|      Julie|
|  2|Janice|  CFO|     Janice|
|  3|  Jake|  CTO|       Jake|
+---+------+-----+-----------+

预期的结果将是:

代码语言:javascript
复制
+---+------+-----+-----------+
| ID|  Name|Title|contns_ptrn|
+---+------+-----+-----------+
|  1| Julie|  CEO|      false|
|  2|Janice|  CFO|      false|
|  3|  Jake|  CTO|       true|
+---+------+-----+-----------+

因为名称列中的第三行包含'Ja‘和'ke’。

如果regexp_extractregexp_replace能够提取或替换非消耗的正则表达式模式,那么我还可以将它们与length一起使用来获得布尔列。

EN

回答 1

Stack Overflow用户

发布于 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不替换任何内容,并返回原始值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56177846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档