You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark DataFrame中Java正则匹配邮箱无结果问题排查

Spark正则匹配邮箱无结果问题排查

我正在测试Spark的正则表达式功能,发现部分正则可正常工作,部分却不行,对此感到困惑。以下代码尝试用正则匹配邮箱地址,但执行后未返回任何结果,我已验证正则本身无问题,请问遗漏了什么?

package com.hsec.correlation;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructType;
import org.json.simple.parser.ParseException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class test {
    public static SparkSession spark;

    public static void main(String[] args) throws IOException, ParseException {
        spark = SparkSession.builder()
                .appName("SparkStructuredStreamingTest")
                .master("local[2]")
                .getOrCreate();
        // code
        StructType structType = new StructType();
        structType = structType.add("id", DataTypes.StringType, false);
        structType = structType.add("email", DataTypes.StringType, false);

        List<Row> nums = new ArrayList<Row>();
        nums.add(RowFactory.create("1", "abc@dec.com"));
        nums.add(RowFactory.create("2", "adHODFSOIHC9ds"));
        nums.add(RowFactory.create("3", "kcbc@dec.com"));
        nums.add(RowFactory.create("4", "nnmp@let.net"));

        Dataset<Row> df = spark.createDataFrame(nums, structType);
        String query="(email REGEXP '(\\w+@[a-zA-Z_]+?\\.com)')";
        df=df.filter(query);
        df.show();
    }

}

实际输出:

+---+-----+
| id|email|
+---+-----+
+---+-----+

预期输出:

+---+--------------+
| id|         email|
+---+--------------+
|  1|   abc@dec.com|
|  3|  kcbc@dec.com|
+---+--------------+

问题原因与修复

问题出在正则表达式的单引号包裹上:
你在正则两端额外添加了单引号'(\\w+@[a-zA-Z_]+?\\.com)',Java解析后传递给Spark的正则会包含这些单引号,而你的邮箱地址里并没有单引号,导致完全匹配失败。

修正后的查询语句只需去掉正则外部的单引号,同时保留Java字符串的正确转义即可:

String query = "email REGEXP '\\w+@[a-zA-Z_]+?\\.com'";

也可以简化正则(\w已经包含下划线,可替换[a-zA-Z_]):

String query = "email REGEXP '\\w+@\\w+?\\.com'";

另外,原代码中的括号()是多余的,不影响功能但可以去掉,让表达式更简洁。

内容的提问来源于stack exchange,提问作者Monu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:06:28