我有一个正在运行的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
未应用。为什么会这样?
1条答案
按热度按时间z9gpfhce1#
找到原因的第一次尝试是检查查询在其他环境中是否可以运行。
配置单元外壳返回了的预期结果
select regexp_replace(master_key, '\\s+', '')
.\
是转义字符,如果配置单元外壳需要一个转义字符,则将此表达式用作javaString
将需要一个转义字符才能通过\
至SparkSession
的sql解析器。所以,这个
Dataset<Row> dataset = session.sql("select regexp_replace(master_key, '\\s+', ''") as key from master_table);
我真的会过去的\s+
到sql解析器:输出:
通过
\\s+
至SparkSession
的sql解析器我们需要添加一个转义\
每个字符\
:输出: