Python PySpark正则表达式引擎不匹配
我正在编写一个正则表达式,用于PySpark数据帧列 我不能碰巧在PySpark中复制我的正则表达式的结果 我尝试了几种方法(见下文),但似乎没有一种有效(甚至在特定的JavaRegex引擎上进行了测试)。我希望获取上面示例中显示的组Python PySpark正则表达式引擎不匹配,python,regex,apache-spark,pyspark,Python,Regex,Apache Spark,Pyspark,我正在编写一个正则表达式,用于PySpark数据帧列 我不能碰巧在PySpark中复制我的正则表达式的结果 我尝试了几种方法(见下文),但似乎没有一种有效(甚至在特定的JavaRegex引擎上进行了测试)。我希望获取上面示例中显示的组 (\w+(?:\s*|\d*)\s+RUE\s.*) [\s\-]+(\d*\s*RUE\s+.*) 代码示例: df = spark.createDataFrame([ ('RESIDENCE LA VENDEENNE 80 81 RUE LOUIS
(\w+(?:\s*|\d*)\s+RUE\s.*)
[\s\-]+(\d*\s*RUE\s+.*)
代码示例:
df = spark.createDataFrame([
('RESIDENCE LA VENDEENNE 80 81 RUE LOUIS LUMIERE',)
], ["adresse1"])
df.withColumn("adresse1", regexp_replace("adresse1", "(\w+(?:\s*|\d*)\s+RUE\s.*)", '$1')).show(truncate=False)
我得到的输出是我的未更改的列:
+-----------------------------------------------+
|adresse1 |
+-----------------------------------------------+
|RESIDENCE LA VENDEENNE 80 81 RUE LOUIS LUMIERE|
+-----------------------------------------------+
当我期望列的值为
81 RUE LOUIS LUMIERE
到目前为止,我完全没有猜测,尤其是因为我之前的工作(匹配)如预期
Spark配置:
- 版本2.4.0-cdh6.2.0
- Scala版本2.11.12
- OpenJDK 64位服务器虚拟机,1.8.0Þ
若要在模式不匹配时保持列值不变,可以使用和:
请注意,您可以将您的模式简化为
\w+\d*\s+RUE\s.*
确实我替换了它,谢谢!好的,它完全有效,谢谢你指出这一点。在API文档上走得太快,把它们两个搞错了。当我继续讨论这个主题@pault时,我脑海中出现了一个问题,如果正则表达式不匹配,我如何防止行值被空值覆盖?我是否必须使用第三列存储正则表达式摘录,然后仅在正则表达式的输出不是空的情况下替换原始列的内容?是的,类似于这样。另一个选择是使用rlike
首先测试列是否与模式匹配——我已经发布了一个更新。这让我感觉更加直观易读(至少对我来说)。再次感谢您的快速回答。我正在测试它。它对物理模式有很大影响吗?对我来说,我的看起来一点也不像,但看起来确实花了很多时间。尽管仍然使用本机PySpark函数。
from pyspark.sql.functions import regexp_extract
df.withColumn(
"adresse1",
regexp_extract("adresse1", r"(\w+(?:\s*|\d*)\s+RUE\s.*)", 1)
).show(truncate=False)
#+--------------------+
#|adresse1 |
#+--------------------+
#|81 RUE LOUIS LUMIERE|
#+--------------------+
from pyspark.sql.functions import col, when
pat = r"(\w+(?:\s*|\d*)\s+RUE\s.*)"
df.withColumn(
"adresse1",
when(
col("adresse1").rlike(pat), regexp_extract("adresse1", pat, 1)
).otherwise(col("adresse1"))
).show(truncate=False)