我试图使用正则表达式在Pyspark中使用以下脚本提取某些邮政编码区:
postcodes.select("raw_postcode", regexp_extract('raw_postcode', '^[a-zA-Z]+\d\d?[a-zA-Z]?', 1).alias("area")).show(40, False)
我得到以下例外:
Py4JJavaError: An error occurred while calling o562.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 17.0 failed 4 times, most recent failure: Lost task 0.3 in stage 17.0 (TID 44, ip-172-31-100-215.eu-west-1.compute.internal, executor 1): java.lang.IndexOutOfBoundsException: No group 1
at java.util.regex.Matcher.group(Matcher.java:538)
我已经在Python中尝试过正则表达式并且它可以工作,但它在pyspark中给我带来了麻烦。帮我找出原因。
答案 0 :(得分:3)
regexp_extract
的第二个参数表示要提取其内容的捕获组的数量。但是,您的正则表达式没有定义捕获组,因此,您需要将0
作为第二个参数传递。
此外,您可以使用[0-9]
代替\d
来避免转义问题。
所以,你可以使用
postcodes.select("raw_postcode",
regexp_extract('raw_postcode', '^[a-zA-Z]+[0-9]{1,2}[a-zA-Z]?', 0).alias("area")
).show(40, False)
<强>详情
^
- 字符串开头[a-zA-Z]+
- 1+ ASCII字母[0-9]{1,2}
- 1或2位数字[a-zA-Z]?
- 可选的ASCII字母。答案 1 :(得分:0)
尝试以下模式,
^([a-zA-Z]+[0-9]{1,2}[a-zA-Z]?)