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
相关产品推荐
相关产品推荐

