Первая попытка найти причину состояла в том, чтобы проверить, работает ли запрос в других средах.
Hive Shell вернул ожидаемый результат для select regexp_replace(master_key, '\\s+', '')
.
\
является escape-символом, и если оболочке куста требуется один escape-символ, использование этого выражения в качестве Java String
потребует еще один escape-символ для передачи \
в 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")));
}
Выход:
tet
Чтобы передать \\s+
в синтаксический анализатор SparkSession
, нам нужно добавить один экранирующий символ \
на \
:
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