спикер jdbc api не может использовать встроенную функцию - PullRequest
0 голосов
/ 22 октября 2018

Я хочу получить подзапрос из таблицы Impala как один набор данных.

Код такой:

String subQuery = "(select to_timestamp(unix_timestamp(now())) as ts from my_table) t"
Dataset<Row> ds = spark.read().jdbc(myImpalaUrl, subQuery, prop);

Но результатом является ошибка:

Caused by: java.sql.SQLDataException: [Cloudera][JDBC](10140) Error converting value to Timestamp.

Я могу использовать unix_timestamp функция, но to_timestmap не удалось, почему?

Я обнаружил, что код в org.apache.spark.sql.execution.datasources.jdbc.JDBC.compute() существует некоторая проблема:

sqlText = s"SELECT $columnList FROM ${options.table} $myWhereClause"

$columList содержит " как "col_name", когдаЯ удаляю ", он работает нормально.

1 Ответ

0 голосов
/ 24 октября 2018

Я решаю эту проблему, добавив диалект, диалект по умолчанию добавит "" к имени столбца,

 JdbcDialect ImpalaDialect = new JdbcDialect(){
        @Override
        public boolean canHandle(String url) {
            return url.startsWith("jdbc:impala") || url.contains("impala");
        }
        @Override
        public String quoteIdentifier(String colName) {
            return colName;
        }
    };

    JdbcDialects.registerDialect(ImpalaDialect);
...