Hive ODBC驱动程序无法识别unix_timestamp

时间:2019-02-18 15:06:17

标签: sql hive odbc

简短版本:

如何通过ODBC驱动程序获得两个时间戳之间的秒数差异?

长版:

使用ODBC进行简单查询(不是我使用强制转换(...作为时间戳)来获得独立的行,而是对带有时间戳数据的表运行实际查询):

select unix_timestamp(cast('2019-02-01 01:02:03' as timestamp)) as tto

我收到错误消息:

  

unix_timestamp不是有效的标量函数或过程调用

我找不到任何可更改此设置的配置选项。本地查询已禁用(因为我使用的是准备好的语句),其他功能也正常工作。我的猜测是unix_timestamp()(不带参数)已过时,驱动程序对防止使用该函数有些热情。

我试图解决该问题,并将时间戳转换为bigint,而不是使用unix_timestamp函数:

select cast(cast('2019-02-01 01:02:03' as timestamp) as bigint)

这很好!但是,当我尝试获取2个时间戳记的差异时:

select cast(cast('2019-02-01 01:02:03' as timestamp) as bigint) - cast(cast('2019-02-01 01:02:03' as timestamp) as bigint)

我收到消息了

  

操作数类型SQL_WCHAR和SQL_WCHAR与二进制不兼容   负运算符

(但仅适用于复杂查询,如果查询仅包含此选择,则不会)。

驱动程序将接受两个时间戳之间的差异,但随后我得到一个间隔类型,该类型无法转换回秒。

我认为这些是ODBC驱动程序中的错误,但是由于我不是付费客户,所以我无法联系Hortonworks,或者由于我不是付费客户而无法与Simba联系。

另一方面,如果我尝试使用floor函数,则会收到消息:

  

“地板”是保留关键字。

是的,我知道它是保留的,我实际上是在尝试它。

有什么办法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

简而言之,如果您不能使用本机语句(即,如果您需要参数化查询),那么官方的Hive ODBC驱动程序真的 really really 不好。

我建议的解决方法是要么得到一个有偿的(例如https://www.progress.com/datadirect-connectors-我试过了,它工作得很好),要么只要您的应用程序支持jdbc就可以。我为Hive找到的所有ODBC驱动程序无论如何都是jdbc的包装器,将jre捆绑在一起。