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; " немедленно ", сделайте это за одну транзакцию, и она завершится успешно.
Вышеупомянутое решение работает для меня. Но очень странно, что так работает.
Кажется, есть ошибка в коде улья, которая останавливает это.
Я сделал следующие вещи в серии.
- Перейдите к целевой схеме, где вы можете найти таблицу
- Использовать dbname (
mktg_dd is the name of our DB
) - Запустите тот же запрос
Вот SQL:
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (viewdate='2014-08-01') location 'path/to data';
Надеюсь, это поможет.
Если у вас есть стол datbasename.tablename
вам придется выполнить stmt.execute("USE databasename");
первый.