web-dev-qa-db-fra.com

Comment supprimer et mettre à jour un enregistrement dans Hive

J'ai installé Hadoop, Hive, Hive JD BC. qui fonctionnent bien pour moi. Mais j'ai toujours un problème. Comment supprimer ou mettre à jour un seul enregistrement avec Hive, car la commande de suppression ou de mise à jour de MySQL ne fonctionne pas dans Hive.

Merci 

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

Vous ne devez pas considérer Hive comme un SGBDR classique, Hive convient mieux au traitement par lots de très grands ensembles de données immuables.

Ce qui suit s'applique aux versions antérieures à Hive 0.14. Voir la réponse de @ashtonium pour les versions ultérieures.

Aucune opération n'est prise en charge pour la suppression ou la mise à jour d'un enregistrement particulier ou d'un ensemble particulier d'enregistrements. Pour moi, il s'agit davantage d'un signe de mauvais schéma.

Voici ce que vous pouvez trouver dans la documentation officielle :

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).

Une façon de contourner cette limitation consiste à utiliser des partitions: je ne sais pas à quoi vous correspondez id, mais si vous obtenez des lots différents d'identifiants séparément, vous pouvez modifier la conception de votre table afin id, et vous pourrez alors facilement déposer des partitions pour les identifiants dont vous souhaitez vous débarrasser.

58
Charles Menguy

À partir de la version Hive 0.14.0: INSERT ... VALUES, UPDATE et DELETE sont désormais disponibles avec la prise en charge complète de ACID.

INSERT ... VALUES Syntax:

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

Où values_row est: (Valeur [ valeur ...]) Où une valeur est nulle ou tout littéral SQL valide

Syntaxe UPDATE:

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

DELETE Syntax:

DELETE FROM tablename [WHERE expression]

De plus, à partir du document Hive Transactions:

Si une table doit être utilisée dans les écritures ACID (insert, update, delete), la propriété de table "transactionnelle" doit être définie sur cette table, en commençant par Hive 0.14.0. Sans cette valeur, les insertions seront effectuées dans l'ancien style. les mises à jour et les suppressions seront interdites.

Hive DML référence:
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML
Référence Hive Transactions:
https://cwiki.Apache.org/confluence/display/Hive/Hive+Transactions

81
ashtonium

Oui, à juste titre. Hive ne supporte pas l'option UPDATE. Mais l’alternative suivante pourrait être utilisée pour obtenir le résultat:

Mettre à jour des enregistrements dans un partitioned Hive table:

  1. La table principale est supposée être partitionnée par une clé.
  2. Chargez les données incrémentielles (les données à mettre à jour) dans une table de transfert partitionnée avec les mêmes clés que la table principale.
  3. Joignez les deux tables (tables principale et intermédiaire) en utilisant une opération LEFT OUTER JOIN comme ci-dessous:

insérer la table d'écrasement partition main_table (c, d) sélectionnez t2.a, t2.b, t2.c, t2.d à partir de staging_table t2 à gauche jointure main_table t1 sur t1.a = t2.a;

Dans l'exemple ci-dessus, les tables main_table et staging_table sont partitionnées à l'aide des touches (c, d). Les tables sont jointes via un LEFT OUTER JOIN et le résultat est utilisé pour OVERWRITE les partitions de la table principale.

Une approche similaire pourrait également être utilisée dans le cas des opérationsun-partitioned Hive tableUPDATE.

15
Sudeesh Kumar

Vous pouvez supprimer des lignes d'une table à l'aide d'une solution de contournement dans laquelle vous écrasez la table par l'ensemble de données que vous souhaitez laisser dans la table à la suite de votre opération. 

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

La solution de contournement est utile principalement pour les suppressions en masse de lignes facilement identifiables. De plus, cela peut évidemment gâcher vos données. Une sauvegarde de la table est donc conseillée et une attention toute particulière est également fournie lors de la planification de la règle de "suppression".

5
user11788

Si vous souhaitez supprimer tous les enregistrements, chargez un fichier vide dans la table en mode 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
3
Kaushik Lele

La CLI vous a dit où est votre erreur: delete WHAT? from student ...

Supprimer: Comment supprimer/tronquer les tables de Hadoop-Hive?

Mise à jour: Mise à jour, option SET dans Hive

3
Apaachee

Une fois que vous avez installé et configuré Hive, créez un tableau simple:

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

Ensuite, essayez d’insérer quelques lignes dans la table de test.

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

Maintenant, essayez de supprimer les enregistrements, vous venez d'insérer dans la table.

Hive>delete from testTable where id = 1;

Erreur! FAILED: SemanticException [Erreur 10294]: Essayez de mettre à jour ou de supprimer en utilisant un gestionnaire de transactions qui ne supporte pas ces opérations.

Par défaut, les transactions sont configurées pour être désactivées. Il a été dit que la mise à jour n'est pas prise en charge avec l'opération de suppression utilisée dans le gestionnaire de conversion. Pour prendre en charge la mise à jour/la suppression, vous devez modifier la configuration suivante.

cd  $Hive_HOME
vi conf/Hive-site.xml

Ajouter les propriétés ci-dessous au fichier

<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>

Redémarrez le service, puis essayez à nouveau de supprimer la commande:

Erreur!

FAILED: LockException [Erreur 10280]: Erreur de communication avec le métastore.

Il y a un problème avec metastore. Pour pouvoir utiliser l'opération insertion/mise à jour/suppression, vous devez modifier la configuration suivante dans conf/Hive-site.xml car cette fonctionnalité est en cours de développement.

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

Redémarrez le service puis supprimez à nouveau la commande:

Hive>delete from testTable where id = 1;

Erreur!

FAILED: SemanticException [Erreur 10297]: Tentative de mise à jour ou de suppression de la table default.testTable n'utilisant pas de AcidOutputFormat ou n'étant pas compartimentée.

Seul le format de fichier ORC est pris en charge dans cette première version. La fonctionnalité a été conçue pour que les transactions puissent être utilisées par n’importe quel format de stockage, ce qui permet de déterminer de quelle manière les mises à jour ou les suppressions s’appliquent aux enregistrements de base (avec un identifiant de ligne explicite ou implicite). ORC.

Les tables doivent être configurées pour utiliser ces fonctionnalités. Les tables du même système n'utilisant pas de transactions et ACID n'ont pas besoin d'être compartimentées.

Voir ci-dessous l'exemple de table construite avec ORCFileformat, le compartiment activé et ('transactional' = 'true').

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

Insérer:

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

Mettre à jour :

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

Effacer :

Hive>delete from testTableNew where id = 1;

Test:

Hive>select * from testTableNew ;
2
Devesh Sharma

Valeurs de configuration à définir pour INSERT, UPDATE, DELETE Outre les nouveaux paramètres énumérés ci-dessus, certains paramètres existants doivent être définis pour prendre en charge INSERT ... VALUES, UPDATE et DELETE.

Clé de configuration Doit être définie sur

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)

Valeurs de configuration à définir pour le compactage

Si les données de votre système n'appartiennent pas à l'utilisateur Hive (c'est-à-dire l'utilisateur sous lequel le métastore Hive est exécuté), Hive devra alors disposer de l'autorisation nécessaire pour s'exécuter en tant qu'utilisateur propriétaire des données afin d'effectuer des compactions. Si vous avez déjà configuré HiveServer2 pour emprunter l'identité des utilisateurs, le seul travail supplémentaire à effectuer consiste à garantir que Hive a le droit d'usurper l'identité des utilisateurs de l'hôte exécutant le métastore Hive. Pour ce faire, ajoutez le nom d'hôte à hadoop.proxyuser.Hive.hosts dans le fichier core-site.xml de Hadoop. Si vous ne l'avez pas encore fait, vous devrez configurer Hive pour qu'il agisse en tant qu'utilisateur proxy. Pour cela, vous devez configurer des clés pour l'utilisateur qui exécute le métastore Hive et ajouter hadoop.proxyuser.Hive.hosts et hadoop.proxyuser.Hive.groups au fichier core-site.xml de Hadoop. Reportez-vous à la documentation Hadoop sur le mode sécurisé de votre version de Hadoop (par exemple, Hadoop 2.5.1 est disponible sur Hadoop en mode sécurisé).

L'instruction UPDATE présente les limitations suivantes:

L'expression dans la clause WHERE doit être une expression prise en charge par une clause Hive SELECT.

Les colonnes de partition et de compartiment ne peuvent pas être mises à jour.

La vectorisation des requêtes est automatiquement désactivée pour les instructions UPDATE. Cependant, les tables mises à jour peuvent toujours être interrogées en utilisant la vectorisation.

Les sous-requêtes ne sont pas autorisées du côté droit de l'instruction SET.

L'exemple suivant montre l'utilisation correcte de cette instruction:

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

Déclaration DELETE

Utilisez l’instruction DELETE pour supprimer les données déjà écrites dans Apache Hive.

DELETE FROM tablename [WHERE expression]; 

L'instruction DELETE a la limitation suivante: La vectorisation de la requête .__ est automatiquement désactivée pour l'opération DELETE. Cependant, les tables contenant des données supprimées peuvent toujours être interrogées par vectorisation.

L'exemple suivant montre l'utilisation correcte de cette instruction:

DELETE FROM students WHERE gpa <= 1,0; 

2
dilshad

La prochaine version de Hive permettra le traitement des mises à jour/suppression basé sur SET, ce qui est de la plus haute importance lorsque vous essayez d'effectuer des opérations CRUD sur un «groupe» de lignes au lieu de prendre une ligne à la fois.

Dans l’intervalle, j’ai essayé une approche basée sur la partition dynamique documentée ici http://linkd.in/1Fq3wdb

S'il vous plaît voir si cela répond à vos besoins.

2
Devopam Mittra

UPDATE ou DELETE un enregistrement n'est pas autorisé dans Hive, mais INSERT INTO est acceptable.
Un extrait de Hadoop: Le guide définitif (3ème édition) :

Les mises à jour, les transactions et les index sont les piliers des bases de données traditionnelles. Cependant, jusqu'à récemment, ces fonctionnalités n'étaient pas considérées comme faisant partie de l'ensemble des fonctionnalités de Hive. Cela est dû au fait que Hive a été conçu pour fonctionner sur des données HDFS à l'aide de MapReduce, où les analyses de table complète sont la norme et une mise à jour de table est réalisée en transformant les données en une nouvelle table. Cela fonctionne bien pour une application d'entreposage de données qui s'exécute sur de grandes parties du jeu de données. 

Hive ne prend pas en charge les mises à jour (ni les suppressions), mais prend en charge INSERT INTO. Il est donc possible d'ajouter de nouvelles lignes à une table existante.

1
zeekvfu

Récemment, je cherchais à résoudre un problème similaire. Apache Hive et Hadoop ne prennent pas en charge les opérations de mise à jour/suppression. Alors ? Donc vous avez deux moyens:

  1. Utilisez une table de sauvegarde: enregistrez la table entière dans une table_sauvegarde, puis tronquez la table d'entrée, puis réécrivez uniquement les données pour lesquelles vous souhaitez conserver.
  2. Utilisez Uber Hudi : Il s'agit d'un framework créé par Uber pour résoudre les limitations de HDFS, notamment la suppression et la mise à jour. Vous pouvez consulter ce lien: https://eng.uber.com/hoodie/

un exemple pour le point 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: Si input_table est une table externe, vous devez suivre le lien suivant: Comment tronquer une table externe partitionnée dans ruche?

0
Yardi

Pour répondre à vos besoins actuels, vous devez lancer la requête ci-dessous.

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

Ceci supprimera la table en cours et créera une nouvelle table avec le même nom avec toutes les lignes sauf les lignes que vous souhaitez exclure/supprimer.

J'ai essayé ceci sur Hive 1.2.1 

0
Rushikesh Garadade

La suppression a été récemment ajoutée à la version 0.14 de Hive Les suppressions ne peuvent être effectuées que sur les tables prenant en charge ACID Le lien ci-dessous est celui d'Apache.

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete

0
Abid

Bonne nouvelle, les mises à jour et les suppressions d'insertion sont désormais possibles sur Hive/Impala avec Kudu.

Vous devez utiliser IMPALA/kudu pour gérer les tables et effectuer des enregistrements d'insertion/mise à jour/suppression. Des détails avec des exemples sont disponibles ici: insert-update-delete-on-hadoop

S'il vous plaît partager les nouvelles si vous êtes excité.

-MIK

0
Mufaddal Kamdar