【问题标题】:spark jdbc api can't use built-in functionspark jdbc api不能使用内置函数
【发布时间】:2018-10-22 07:52:24
【问题描述】:

我想从 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" 一样,当我删除 " 它工作正常。

【问题讨论】:

标签: jdbc apache-spark-sql impala


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2022-01-09
    相关资源
    最近更新 更多