不支持Hive方法

我试图使用Hive作为底层数据存储运行SQl查询,该查询调用Big Decimal函数并引发以下错误:

不支持的方法

org.apache.hadoop.hive.jdbc.HivePreparedStatement.setBigDecimal(HivePreparedStatement.java:317) 

这只是因为Hive不支持如下:

 public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { // TODO Auto-generated method stub throw new SQLException("Method not supported"); } 

请建议可用于解决此类问题的其他解决方法或修复方法

最初的Hive JDBC驱动程序仅支持少数JDBC接口,请参阅HIVE-48:支持JDBC连接以实现Hive和RDBMS之间的互操作性 。 因此, 提交会为CallableStatementPreparedStatement等接口留下自动生成的“不支持”代码。

使用HIVE-2158:根据当前HIVE支持的数据类型添加HivePreparedStatement实现,其中一些方法被充实,请参阅提交 。 但是没有添加像Blob,AsciiStream,二进制流和… bigDecimal这样的类型。 当HIVE-2158被解决时( 2011-06-15 ),Hive中对DECIMAL的支持不存在,它附带了HIVE-2693:在2013-01-17 添加DECIMAL数据类型 。 添加对DECIMAL的支持后,看起来JDBC驱动程序接口未更新。

所以基本上JDBC驱动程序需要使用支持的新类型进行更新。 你应该为此提交一份JIRA 。 解决方法:不要使用DECIMAL,或者不要使用PrepareStatement。

我有“.setObject”方法的类似问题,但在更新到1.2.1版之后,它已得到解决。 “。setBigDecimal”目前尚未实现。 这是该类的实现 。 但是.setObject方法当前有这样的行,实际上解决了这个问题。

 if(value instanceof BigDecimal){ st.setString(valueIndex, value.toString()); } 

这对我有用,但你可以在没有任何警告的情况下失去精确度!

一般来说,元模型似乎支持十进制。 如果你得到像这样的statemant的所有列

 Column[] columnNames = table.getColumns(); 

并且其中一列是十进制的,您会注意到没有关于精度的信息。