spark jdbc api不能使用内置函数
Posted
技术标签:
【中文标题】spark jdbc api不能使用内置函数【英文标题】:spark jdbc api can't use built-in function 【发布时间】: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"
一样,当我删除 "
它工作正常。
【问题讨论】:
now()
不是已经是时间戳了吗?
我只是以now()
为例
***.com/questions/29844144/… 可能有用
谢谢,我自己解决了这个问题。
【参考方案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);
【讨论】:
以上是关于spark jdbc api不能使用内置函数的主要内容,如果未能解决你的问题,请参考以下文章