Подтвердить что ты не робот

Как удалить и обновить запись в Hive

У меня есть Hadoop, Hive, Hive JD BC. которые работают отлично для меня. Но у меня все еще есть проблема. Как удалить или обновить одну запись с помощью Hive, поскольку команда delete или update MySQL не работает в кусте.

Спасибо

hive> delete from student where id=1;
Usage: delete [FILE|JAR|ARCHIVE] <value> [<value>]*
Query returned non-zero code: 1, cause: null
4b9b3361

Ответ 1

Не следует думать о Hive как о обычной СУБД. Hive лучше подходит для пакетной обработки очень больших наборов неизменяемых данных.

Следующее относится к версиям до Hive 0.14, см. ответ ashtonium для более поздних версий.

Операция удаления или обновления определенной записи или определенного набора записей не поддерживается, и для меня это скорее признак плохой схемы.

Вот что вы можете найти в официальной документации:

Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
incur substantial overheads in job submission and scheduling. As a result -
latency for Hive queries is generally very high (minutes) even when data sets
involved are very small (say a few hundred megabytes). As a result it cannot be
compared with systems such as Oracle where analyses are conducted on a
significantly smaller amount of data but the analyses proceed much more
iteratively with the response times between iterations being less than a few
minutes. Hive aims to provide acceptable (but not optimal) latency for
interactive data browsing, queries over small data sets or test queries.

Hive is not designed for online transaction processing and does not offer
real-time queries and row level updates. It is best used for batch jobs over
large sets of immutable data (like web logs).

Чтобы обойти это ограничение, можно использовать разделы: я не знаю, чему соответствует id, но если вы получаете разные пакеты идентификаторов по отдельности, вы можете изменить дизайн своей таблицы так, что он разделен по идентификатору, и тогда вы сможете легко удалить разделы для идентификаторов, от которых хотите избавиться.

Ответ 2

По версии Hive 0.14.0: INSERT... VALUES, UPDATE и DELETE теперь доступны с полной поддержкой ACID.

INSERT... VALUES Синтаксис:

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

Где values_row: (значение [, значение...]) где значение является либо нулевым, либо любым действительным литералом SQL

UPDATE Синтаксис:

UPDATE tablename SET column = value [, column = value ...] [WHERE expression]

УДАЛИТЬ Синтаксис:

DELETE FROM tablename [WHERE expression]

Кроме того, из транзакций Hive docs:

Если таблица используется в записи ACID (вставка, обновление, удаление), тогда свойство таблицы "transactional" должно быть установлено в этой таблице, начиная с Hive 0.14.0. Без этого значения вставки будут выполняться в старом стиле; обновления и удаления запрещены.

Ссылка Hive DML:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Справочная информация о кустах:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

Ответ 3

Да, правильно сказал. Улей не поддерживает опцию UPDATE. Но для достижения результата можно использовать следующую альтернативу:

Обновить записи в partitioned Hive table:

  • Предполагается, что основная таблица разбивается на некоторые ключи.
  • Загрузите инкрементные данные (данные для обновления) в промежуточную таблицу, разделенную теми же ключами, что и основная таблица.
  • Соедините две таблицы (основные и промежуточные таблицы), используя операцию LEFT OUTER JOIN, как показано ниже:

Вставить таблицу перезаписи таблицы main_table (c, d)      выберите t2.a, t2.b, t2.c, t2.d из staging_table t2, оставленное внешним соединением main_table t1 на t1.a = t2.a;

В приведенном выше примере main_table и staging_table секционируются с помощью клавиш (c, d). Таблицы соединяются с помощью LEFT OUTER JOIN, и результат используется для ПЕРЕЗАГРУЗКИ разделов в main_table.

Аналогичный подход можно использовать и для операций un-partitioned Hive table UPDATE.

Ответ 4

Вы можете удалить строки из таблицы с помощью обходного пути, в котором вы переписываете таблицу с помощью набора данных, который вы хотите оставить в таблице, в результате вашей операции.

insert overwrite table your_table 
    select * from your_table 
    where id <> 1
;

Обходной путь полезен в основном для объемных удалений легко идентифицируемых строк. Кроме того, очевидно, что это может испортить ваши данные, поэтому рекомендуется создавать резервную копию таблицы и проявлять осторожность при планировании правила "удаления".

Ответ 5

Значения конфигурации для установки для INSERT, UPDATE, DELETE В дополнение к новым параметрам, перечисленным выше, некоторые существующие параметры должны быть установлены для поддержки INSERT... VALUES, UPDATE и DELETE.

Ключ конфигурации Должно быть установлено значение

hive.support.concurrency true (default is false) hive.enforce.bucketing true (default is false) (Not required as of Hive 2.0) hive.exec.dynamic.partition.mode nonstrict (default is strict)

Значения конфигурации для установки для уплотнения

Если данные в вашей системе не принадлежат пользователю Hive (т.е. пользователю, что метастатистика улей работает как), тогда для Hive потребуется разрешение для запуска в качестве пользователя, которому принадлежат данные, чтобы выполнять компромиссы. Если вы уже настроили HiveServer2 для олицетворения пользователей, то единственной дополнительной работой, которая должна быть сделана, является то, что Hive имеет право олицетворять пользователей от хоста, использующего метастабильность улья. Это делается путем добавления имени хоста к hasoop.proxyuser.hive.hosts в файле Hadoop core-site.xml. Если вы еще этого не сделали, вам нужно настроить Hive для использования в качестве прокси-пользователя. Для этого вам нужно настроить keytabs для пользователя, запускающего метастартик улья, и добавить файлы hasoop.proxyuser.hive.hosts и hadoop.proxyuser.hive.groups в файл Hadoop core-site.xml. См. Документацию Hadoop в безопасном режиме для вашей версии Hadoop (например, для Hadoop 2.5.1 в Hadoop в безопасном режиме).

Оператор UPDATE имеет следующие ограничения:

Выражение в предложении WHERE должно быть выражением, поддерживаемым предложением Hive SELECT.

Разделы разделов и столбцов не могут быть обновлены.

Инициализация запроса автоматически отключается для операторов UPDATE. Однако обновленные таблицы могут быть запрошены с помощью векторизации.

Подзапросы не разрешены в правой части инструкции SET.

В следующем примере показано правильное использование этого оператора:

UPDATE students SET name = null WHERE gpa <= 1.0;

Заявление DELETE

Используйте оператор DELETE для удаления данных, уже записанных в Apache Hive.

DELETE FROM tablename [WHERE expression];

Оператор DELETE имеет следующее ограничение: для операции DELETE автоматически отключается запрос. Однако таблицы с удаленными данными могут быть запрошены с помощью векторизации.

В следующем примере показано правильное использование этого оператора:

DELETE FROM students WHERE gpa <= 1,0;

Ответ 7

Если вы хотите удалить все записи, то в качестве обходного пути загрузите пустой файл в таблицу в режиме OVERWRITE.

hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee;
Loading data to table default.employee
Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0]
OK
Time taken: 0.19 seconds

hive> SELECT * FROM employee;
OK
Time taken: 0.052 seconds

Ответ 8

Предстоящая версия Hive собирается разрешить обработку обновления/удаления на основе SET, что имеет первостепенное значение при попытке выполнить операции CRUD в "связке" строк вместо того, чтобы принимать по одной строке за раз.

В то же время, я пробовал подход с динамическим разделением, описанный здесь http://linkd.in/1Fq3wdb.

Посмотрите, подходит ли она для ваших нужд.

Ответ 9

После того, как вы установили и настроили Hive, создайте простую таблицу:

hive>create table testTable(id int,name string)row format delimited fields terminated by ',';

Затем попробуйте вставить несколько строк в тестовую таблицу.

hive>insert into table testTable values (1,'row1'),(2,'row2');

Теперь попробуйте удалить записи, которые вы только что вставили в таблицу.

hive>delete from testTable where id = 1;

Ошибка! СБОЙ: SemanticException [Ошибка 10294]: попытка выполнить обновление или удаление с помощью диспетчера транзакций, который не поддерживает эти операции.

По умолчанию транзакции отключены. Говорят, что обновление не поддерживается операцией удаления, используемой в менеджере преобразования. Для поддержки обновления/удаления необходимо изменить следующую конфигурацию.

cd  $HIVE_HOME
vi conf/hive-site.xml

Добавьте ниже свойства в файл

<property>
  <name>hive.support.concurrency</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.enforce.bucketing</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.exec.dynamic.partition.mode</name>
  <value>nonstrict</value>
 </property>
 <property>
  <name>hive.txn.manager</name>
  <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
 </property>
 <property>
  <name>hive.compactor.initiator.on</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.compactor.worker.threads</name>
  <value>2</value>
 </property>

Перезапустите службу и попробуйте снова удалить команду:

Ошибка!

FAILED: LockException [Ошибка 10280]: Ошибка связи с метастазами.

Есть проблема с метастарем. Чтобы использовать операцию вставки/обновления/удаления, вам необходимо изменить следующую конфигурацию в файле conf/hive-site.xml, так как функция находится в стадии разработки.

<property>
  <name>hive.in.test</name>
  <value>true</value>
 </property>

Перезапустите службу и затем снова удалите команду:

hive>delete from testTable where id = 1;

Ошибка!

СБОЙ: SemanticException [Ошибка 10297]: Попытка выполнить обновление или удаление таблицы default.testTable, которая не использует AcidOutputFormat или не помещена в буфер.

В этом первом выпуске поддерживается только формат файла ORC. Функция была построена таким образом, что транзакции могут использоваться любым форматом хранения, который может определять, как обновления или удаления применяются к базовым записям (в основном, с явным или неявным идентификатором строки), но пока работа по интеграции была выполнена только для ORC.

Таблицы должны быть сгруппированы, чтобы использовать эти функции. Таблицы в одной и той же системе, не использующие транзакции и ACID, не должны быть объединены.

См. Ниже пример встроенной таблицы с ORCFileformat, включенным сегментом и ('транзакция' = 'истина').

hive>create table testTableNew(id int ,name string ) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

Вставить:

hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');

Обновить:

hive>update testTableNew set name = 'updateRow2' where id = 2;

Удалять:

hive>delete from testTableNew where id = 1;

Тестовое задание:

hive>select * from testTableNew ;

Ответ 10

UPDATE или DELETE запись не разрешена в Hive, но INSERT INTO допустимо.
Отрывок из Hadoop: The Definitive Guide (3-е издание):

Обновления, транзакции и индексы являются основой традиционных баз данных. Тем не менее, до недавнего времени эти функции не считались частью набора функций Hive. Это связано с тем, что Hive был построен для работы с данными HDFS с использованием MapReduce, где полноскатные проверки являются нормой, а обновление таблицы достигается путем преобразования данных в новую таблицу. Для приложения хранилища данных, которое выполняется на больших частях набора данных, это работает хорошо.

Hive не поддерживает обновления (или удаляет), но поддерживает INSERT INTO, поэтому можно добавить новые строки в существующую таблицу.

Ответ 11

Чтобы выполнить текущую потребность, вам нужно выполнить следующий запрос

> insert overwrite table student 
> select *from student 
> where id <> 1;

Это приведет к удалению текущей таблицы и созданию новой таблицы с тем же именем со всеми строками, кроме строк, которые вы хотите исключить/удалить

Я пробовал это на Hive 1.2.1

Ответ 13

Хорошие новости, Вставка обновлений и удалений теперь возможна на Hive/Impala с использованием Kudu.

Вам необходимо использовать IMPALA/kudu для поддержки таблиц и выполнения записей вставки/обновления/удаления. Подробности с примерами можно найти здесь: insert-update-delete-on-hadoop

Пожалуйста, поделитесь новостью, если вы взволнованы.

-mik

Ответ 14

Недавно я пытался решить аналогичную проблему: Apache Hive, Hadoop не поддерживают операции обновления/удаления. Так? Итак, у вас есть два пути:

  1. Использование резервной таблицы: сохраните всю таблицу в backup_table, затем обрежьте входную таблицу, а затем перезаписывайте только те данные, которые вам интересны.
  2. Используйте Uber Hudi: Это среда, созданная Uber для разрешения ограничений HDFS, включая удаление и обновление. Вы можете посмотреть по этой ссылке: https://eng.uber.com/hoodie/

пример для пункта 1:

Create table bck_table like input_table;
Insert overwrite table bck_table 
    select * from input_table;
Truncate table input_table;
Insert overwrite table input_table
    select * from bck_table where id <> 1;

NB. Если input_table является внешней таблицей, вы должны перейти по следующей ссылке: Как урезать секционированную внешнюю таблицу в кусте?