java.lang.IndexOutOfBoundsException: 无组 1 | 派斯帕克

ebe*_*tbm 3 regex pyspark

我正在尝试使用正则表达式和 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)
Run Code Online (Sandbox Code Playgroud)

我已经单独在 Python 中尝试了正则表达式并且它有效,但是它在 pyspark 中给我带来了麻烦。帮我查一下原因。

Wik*_*żew 5

第二个参数 toregexp_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)
Run Code Online (Sandbox Code Playgroud)

细节

  • ^ - 字符串的开始
  • [a-zA-Z]+ - 1+ 个 ASCII 字母
  • [0-9]{1,2} - 1 或 2 位数字
  • [a-zA-Z]? - 一个可选的 ASCII 字母。