PySpark正则提取邮编区域触发IndexOutOfBoundsException问题求助
解决PySpark regexp_extract触发IndexOutOfBoundsException: No group 1的问题
嘿,这个问题我之前踩过一模一样的坑!你遇到的java.lang.IndexOutOfBoundsException: No group 1错误,根源特别明确:
你调用regexp_extract时第三个参数传了1,这个参数指定的是要提取正则表达式里的第1个捕获组,但你写的正则^[a-zA-Z]+\d\d?[a-zA-Z]?根本没有定义任何捕获组——也就是没用到圆括号()把你想要提取的部分包裹起来!Spark找不到对应的分组,自然就抛出这个异常了。
修复方案
把你想要提取的区域部分用圆括号括起来,创建一个捕获组,这样参数1就能正确指向这个分组了。修改后的代码如下:
postcodes.select( "raw_postcode", regexp_extract('raw_postcode', '^([a-zA-Z]+\\d\\d?[a-zA-Z]?)', 1).alias("area") ).show(40, False)
额外提示
- 如果你的需求只是提取整个正则匹配的内容,其实也可以把第三个参数改成
0(0代表匹配整个正则表达式的结果),这样不用加括号也能运行,但用捕获组会更清晰,尤其是后续需要调整提取部分的时候。 - 考虑到可能存在不匹配正则的邮编记录,
regexp_extract会给这些记录返回空字符串,你可以根据需求加上过滤逻辑:from pyspark.sql.functions import col postcodes.select( "raw_postcode", regexp_extract('raw_postcode', '^([a-zA-Z]+\\d\\d?[a-zA-Z]?)', 1).alias("area") ).where(col("area") != "").show(40, False)
内容的提问来源于stack exchange,提问作者ultraInstinct
相关产品推荐
相关产品推荐

