RODBC: невозможно указать схему с помощью команды ALTER TABLE

Я могу указать схему с помощью CREATE TABLE или DROP TABLE:

sqlQuery(odbcConnect("Hive"), "DROP TABLE schema.table;")

но не с помощью ALTER TABLE:

sqlQuery(odbcConnect("Hive"), "ALTER TABLE schema.table RENAME TO schema.new_table;")

Сообщение об ошибке:... несоответствующий вход "RENAME", ожидающий KW_EXCHANGE рядом с "таблицей" в разделе alter exchange

Это тоже не сработало:

sqlQuery(odbcConnect("Hive"), "USE schema; ALTER TABLE table RENAME TO new_table;")

Сообщение об ошибке:... отсутствует EOF в ';' рядом с "схемой"

PS В конце концов, я решил эту проблему, используя INSERT INTO TABLE. Я все еще хотел бы знать ответ на оригинальный вопрос, все же.

4 ответа

Решение

Если возможно, вы можете попробовать обновить Hive до версии 0.14.0.

Проблема с Hive, не обрабатывающая схему в инструкциях ALTER TABLE schema.table, была решена в Hive 0.14.0. См. Следующую JIRA по этой проблеме:

https://issues.apache.org/jira/browse/HIVE-9180

Если вы можете обновить, оригинальная команда "ALTER TABLE schema.table" будет работать.

У меня была такая же проблема при попытке добавить новый раздел. Но затем я выдал 2 оператора: " использовать имя_схемы " и " изменить имя таблицы (без имени_схемы) добавить раздел... ", и все прошло нормально. Кажется, что оператор ALTER не поддерживает имя схемы в Hive. Попробуйте выполнить эти два последних утверждения по отдельности: " ИСПОЛЬЗОВАТЬ схему; ", а затем " ALTER TABLE table RENAME TO new_table; " Я не знаю, как написать это в Java, но это очень похоже на то, что мы имеем в базе данных Oracle: когда вы попытаться " немедленно выполнить" alter... smth; alter... smth_else; ' "как одно утверждение, он потерпит неудачу. Но если вы разделите их следующим образом: " begin execute execute" alter..smth; "; выполнить" alter..smth_else "; end; " немедленно ", сделайте это за одну транзакцию, и она завершится успешно.

Вышеупомянутое решение работает для меня. Но очень странно, что так работает.

Кажется, есть ошибка в коде улья, которая останавливает это.

Я сделал следующие вещи в серии.

  1. Перейдите к целевой схеме, где вы можете найти таблицу
  2. Использовать dbname (mktg_dd is the name of our DB)
  3. Запустите тот же запрос

Вот SQL:

ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (viewdate='2014-08-01') location 'path/to data';

Надеюсь, это поможет.

Если у вас есть стол datbasename.tablename вам придется выполнить stmt.execute("USE databasename"); первый.

Другие вопросы по тегам