2013-11-26 4 views
1

Я пытаюсь запустить запрос с использованием улей в качестве основного хранилища данных, запрос вызывает большую десятичную функцию и выдает следующее сообщение об ошибке:Hive Метод не поддерживается

метода не поддерживается на

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

это просто потому, что улей не поддерживает следующим образом:

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

Просьба предложить то, что могут быть и другие обходные пути или исправления, доступные для борьбы с такой проблемой

ответ

4

Исходный драйвер Jive JVBC поддерживает только некоторые интерфейсы JDBC, см. HIVE-48: Support JDBC connections for interoperability between Hive and RDBMS. Таким образом, commit оставил автогенерированный код «не поддерживается» для таких интерфейсов, как CallableStatement или PreparedStatement.

С HIVE-2158: add the HivePreparedStatement implementation based on current HIVE supported data-type некоторые из методов были сфокусированы, см. commit. Но такие типы, как Blob, AsciiStream, двоичный поток и ... bigDecimal не были добавлены. Когда был разрешен HIVE-2158 (2011-06-15), поддержка DECIMAL в улье не была, он пришел с HIVE-2693: Add DECIMAL data type, в 2013-01-17. Когда была добавлена ​​поддержка DECIMAL, похоже, что интерфейс драйвера JDBC не обновлялся.

Так что в основном драйвер JDBC должен быть обновлен с поддерживаемыми новыми типами. Для этого вы должны указать JIRA. Обход проблемы: не используйте DECIMAL или не используйте PrepareStatement.

+0

Большое спасибо за ваш быстрый ответ. Надеюсь, этот патч отлично работает. –

0

У меня была аналогичная проблема с методом «.setObject», но после обновления до версии 1.2.1 она была разрешена. ".setBigDecimal" в настоящее время он не реализован. Here is the implementation of the class. Однако в методе .setObject в настоящее время есть строка вроде этого, которая на самом деле решает дело.

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

Это сработало для меня, но вы можете потерять точность без предупреждения!

В общем, кажется, что метамодель поддерживает десятичные ошибки. Если вы все столбцы с statemant как этот

Column[] columnNames = table.getColumns(); 

и один из столбцов десятичные вы заметите, что нет никакой информации о точности.

Смежные вопросы