spark jdbc api不能使用内置函数

gab6jxml  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(514)

我想把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"` ,当我删除 `"` 很好用。
deikduxw

deikduxw1#

我通过添加方言来解决这个问题,默认的方言会添加 "" 到列名,

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);

相关问题