java sparksession配置单元sql未应用regexp\u replace

w6lpcovy  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(344)

我有一个正在运行的spark应用程序执行配置单元查询。
对于新的要求,我需要从所选键中删除所有空白。
根据apache文档 regexp_replace 适合我的情况: regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) 返回替换初始字符串中与模式中定义的java正则表达式语法相匹配的所有子字符串所产生的字符串,该字符串包含替换示例。>例如, regexp_replace("foobar", "oo|ar", "") 退货 'fb.' 请注意,在使用预定义字符类时需要注意:使用 '\s' 因为第二个参数将匹配字母s; '\\s' 必须匹配空格等。
运行此:

public class SparkSql {

    private SparkSession session = SparkSession.builder()
            .appName("hive-sql")
            .config("spark.config.option", "configuration")
            .enableHiveSupport()
            .getOrCreate();

    // Omitted code here ...

    public void execute() {
        Dataset<Row> dataset = session.sql("select regexp_replace(master_key, '\\s+', ''") as key from master_table);
        JavaRDD<Row> rdd = context.parallelize(dataset.collectAsList(), factor);

        for (Row row : rdd.collect())
            System.out.println(row.getString(row.fieldIndex("key")));
    }
}

输出:

ABCD 100000

预期:

ABCD100000

出于某种原因, regexp_replace 未应用。为什么会这样?

z9gpfhce

z9gpfhce1#

找到原因的第一次尝试是检查查询在其他环境中是否可以运行。
配置单元外壳返回了的预期结果 select regexp_replace(master_key, '\\s+', '') . \ 是转义字符,如果配置单元外壳需要一个转义字符,则将此表达式用作java String 将需要一个转义字符才能通过 \SparkSession 的sql解析器。
所以,这个 Dataset<Row> dataset = session.sql("select regexp_replace(master_key, '\\s+', ''") as key from master_table); 我真的会过去的 \s+ 到sql解析器:

public void execute() {
    Dataset<Row> dataset = session.sql("select regexp_replace("test", '\\s+', ''") as key from master_table);
    JavaRDD<Row> rdd = context.parallelize(dataset.collectAsList(), factor);

    for (Row row : rdd.collect())
        System.out.println(row.getString(row.fieldIndex("key")));
}

输出:

test

通过 \\s+SparkSession 的sql解析器我们需要添加一个转义 \ 每个字符 \ :

public void execute() {
    Dataset<Row> dataset = session.sql("select regexp_replace(master_key, '\\\\s+', ''") as key from master_table);
    JavaRDD<Row> rdd = context.parallelize(dataset.collectAsList(), factor);

    for (Row row : rdd.collect())
        System.out.println(row.getString(row.fieldIndex("key")));
}

输出:

ABCD100000

相关问题