首页 > 解决方案 > 带有反斜杠的 Spark Regex regexp_extract 错误:SQL 语句中的错误:NullPointerException

问题描述

我有一个数据集,我需要在其中提取域样式格式的别名:域\别名,其中别名在反斜杠之后。反斜杠似乎被视为转义字符,尽管有几次尝试将其视为字符。我首先使用已知的非转义字符(成功的正斜杠)测试了我的正则表达式模式。然后,我尝试了使用反斜杠的相同模式,然后使用我熟悉的方法进行了几次排列,以使正则表达式将反斜杠视为一个字符,而不是作为转义字符而不成功。你怎么做才能让这个正则表达式模式与火花中的反斜杠一起工作?

正则表达式模式验证

select regexp_extract('domain/alias', '/(.*)') as test --Results: alias Works with forward slash.

排列和结果

select regexp_extract('domain\alias', '\(.*)') as test --Results: domainalias Removes the backslash for some reason

select regexp_extract('domain\alias', '"""\"""(.*)') as test --Results: empty string

select regexp_extract('domain\alias', '"""\\"""(.*)') as test --Results: empty string

select regexp_extract('domain\alias', '\\(.*)') as test --Results: Error in SQL statement: NullPointerException: 

select regexp_extract('domain\alias', '\\\(.*)') as test --Results: Error in SQL statement: NullPointerException: 

标签: regexapache-sparkapache-spark-sql

解决方案


我能够通过调整火花设置来解决这个问题。在我使用的 Databricks 集群中,我运行了这个:

set spark.sql.parser.escapedStringLiterals=true;

我的正则表达式模式现在按预期工作:

select regexp_extract('domain\alias', '\\(.*)') as test --Results: alias

推荐阅读