Comment supprimer et mettre à jour un enregistrement dans Hive
j'ai installé Hadoop, Hive, Hive JD BC. qui sont en cours d'exécution fine pour moi. Mais j'ai encore un problème. Comment supprimer ou mettre à jour un enregistrement en utilisant Hive parce que la commande supprimer ou mettre à 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
12 réponses
vous ne devriez pas penser à Hive comme un RDBMS régulier, Hive est mieux adapté pour le traitement par lots sur 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.
il n'y a pas d'opération supportée pour la suppression ou la mise à jour d'un enregistrement particulier ou d'un ensemble particulier d'enregistrements, et pour moi c'est plus un signe d'un schéma médiocre.
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 est d'utiliser des partitions: Je ne sais pas à quoi vous id correspond, mais si vous obtenez différents lots d'ids séparément, vous pourriez redessiner votre table de sorte qu'elle soit partitionnée par id, et alors vous seriez en mesure de facilement laisser tomber des partitions pour les ids que vous voulez vous débarrasser.
à partir de la version de Ruche 0.14.0 : insérer...Les valeurs, la mise à jour et la suppression sont maintenant disponibles avec un support complet.
insérer ... Syntaxe des valeurs:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
où values_row est: ( valeur [, valeur ...] ) où une valeur est soit null soit tout SQL littéral valide
mise à jour de la syntaxe:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
supprimer la syntaxe:
DELETE FROM tablename [WHERE expression]
en outre, de la Ruche des Transactions doc:
si une table doit être utilisée dans ACID writes (insert, update, delete) alors la propriété" transactional " doit être définie sur cette table, en commençant par Hive 0.14.0. Sans cette valeur, les inserts seront faits dans l'ancien style; les mises à jour et les suppressions seront interdites.
Hive référence DML:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
référence des Transactions de Ruche:
https://cwiki.apache.org/confluence/display/Hive/Hive + Transactions
oui, dit à juste titre. Hive ne supporte pas L'option UPDATE. Mais l'alternative suivante pourrait être utilisée pour atteindre le résultat:
mise à Jour des enregistrements dans une partitioned Hive table
:
- on suppose que la table principale est divisée par une clé.
- charger les données incrémentielles (les données à mettre à jour) dans une table de staging séparée avec les mêmes touches que la table principale.
- Joindre les deux tables (main et staging tables) en utilisant une opération de jointure externe gauche comme ci-dessous:
insérer remplacer le tableau main_table partition (c,d) sélectionnez t2.une, t2.B, t2.C, t2.D de staging_table t2 gauche extérieur rejoindre main_table t1 sur t1.a = t2.a;
dans l'exemple ci-dessus, le main_table et le staging_table sont partitionnés en utilisant les touches (c,D). Les tables sont jointes via une jointure externe gauche et le résultat est utilisé pour écraser les partitions dans le main_table.
une approche similaire pourrait être utilisée dans le cas de un-partitioned Hive table
opérations de mise à jour aussi.
vous pouvez supprimer des lignes d'une table en utilisant une solution de contournement, dans laquelle vous écrasez la table par l'ensemble de données que vous voulez 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 surtout pour les suppressions massives de lignes facilement identifiables. En outre, évidemment faire cela peut brouiller vos données, de sorte qu'une sauvegarde de la table est adviced et le soin lors de la planification de la "suppression" règle également adviced.
le CLI vous a dit Où est votre erreur: delete WHAT? from student
...
Supprimer : Comment supprimer/tronquer des tables de Hadoop-Ruche?
mise à Jour : mise à Jour , l'option réglage de la Ruche
la version à venir de Hive va permettre la gestion des mises à jour/suppressions basée sur SET, ce qui est de la plus haute importance quand on essaie de faire des opérations CRUD sur un " tas " de lignes au lieu de prendre une ligne à la fois.
entre-temps, j'ai essayé une approche dynamique basée sur la partition documentée ici http://linkd.in/1Fq3wdb .
s'il vous plaît voir si cela convient à votre besoin.
si vous voulez supprimer tous les enregistrements puis comme une solution de contournement charger un fichier vide dans la table en mode de réécriture
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
UPDATE
ou DELETE
un enregistrement n'est pas autorisé dans la Ruche, mais INSERT INTO
est acceptable.
Un extrait de Hadoop: le Guide définitif (3e édition) :
les Mises à jour, les transactions, et les index sont les piliers traditionnels de bases de données. Pourtant, jusqu'à récemment, ces caractéristiques n'ont pas été considérées comme faisant partie de l'ensemble des caractéristiques de Hive. C'est parce que Hive a été construit pour fonctionner sur des données HDFS en utilisant MapReduce, où les scans complets de la table sont la norme et une mise à jour de la table est réalisée en transformant les données dans une nouvelle table. Pour une application de stockage de données qui tourne sur de grandes parties de l'ensemble de données, cela fonctionne bien.
Hive ne supporte pas les mises à jour (ou les suppressions), mais il supporte L'insertion, il est donc possible d'ajouter de nouvelles lignes à une table existante.
valeurs de Configuration à définir pour insérer, mettre à jour, supprimer En plus des nouveaux paramètres énumérés ci-dessus, certains paramètres existants doivent être définis pour supporter INSERT ... Valeurs, mise à jour et suppression.
clé de Configuration Doit être réglé à
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 ne sont pas détenues par l'utilisateur de la ruche (c.-à-d. l'utilisateur sous lequel le métastore De La Ruche s'exécute), alors la ruche aura besoin de permission pour exécuter en tant qu'utilisateur propriétaire des données afin d'effectuer des compactions. Si vous avez déjà configuré HiveServer2 pour imiter les utilisateurs, alors le seul travail supplémentaire à faire est de s'assurer que Hive a le droit d'imiter les utilisateurs depuis l'hôte qui exécute le métastore De La Ruche. Ceci est fait en ajoutant le nom d'hôte à hadoop.proxyuser.ruche.des hôtes sur le site principal de Hadoop.fichier xml. Si vous ne l'avez pas déjà fait, ensuite, vous aurez besoin de configurer Hive pour agir en tant qu'utilisateur proxy. Pour cela, vous devez configurer keytabs pour l'utilisateur qui exécute le métastore De La Ruche et ajouter hadoop.proxyuser.ruche.les hôtes et hadoop.proxyuser.ruche.groupes sur le site principal de Hadoop.fichier xml. Consultez la documentation Hadoop sur le mode sécurisé pour votre version de Hadoop (par exemple, pour Hadoop 2.5.1, il est chez Hadoop en Mode sécurisé).
la déclaration de mise à jour a les limitations suivantes:
l'expression dans la clause WHERE doit être une expression supportée par une clause de sélection de Ruche.
Les colonnes de Partition et de seaune peuvent pas être mises à jour.
La vectorisation de requêteest automatiquement désactivée pour les instructions de mise à jour. Cependant, les tableaux mis à jour peuvent encore être interrogés en utilisant la vectorisation.
Les sous-sériesne sont pas autorisées du côté droit de la déclaration.
l'exemple suivant démontre l'usage correct de cette déclaration:
UPDATE students SET name = null WHERE gpa <= 1.0;
supprimer la mention
utilisez L'instruction DELETE pour supprimer des données déjà écrites à Apache Hive.
DELETE FROM tablename [WHERE expression];
la mention Supprimer comporte la limitation suivante:: la vectorisation de la requête est automatiquement désactivée pour L'opération de suppression. Cependant, les tableaux avec des données supprimées peuvent encore être interrogés utilisation de la vectorisation.
l'exemple suivant illustre l'usage correct de cet énoncé:
DELETE FROM students WHERE gpa <= 1,0;
Supprimer a été récemment ajouté dans la version 0.14 de Hive Les suppressions ne peuvent être effectuées que sur les tables supportant L'acide Ci-dessous est le lien de Apache .
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete
pour répondre à votre besoin actuel, vous devez lancer la requête ci-dessous
> insert overwrite table student
> select *from student
> where id <> 1;
cela supprimera la table courante et créera une nouvelle table avec le même nom avec toutes les lignes sauf les lignes que vous voulez exclure/supprimer
j'ai essayé sur Hive 1.2.1
bonnes nouvelles,les mises à jour et les suppressions sont maintenant possibles sur Hive/Impala en utilisant Kudu.
vous devez utiliser IMPALA/kudu pour maintenir les tables et effectuer insert/update/delete records. Les détails avec des exemples peuvent être trouvés ici: insérer-update-delete-sur-hadoop
s'il vous plaît partager les nouvelles si vous êtes excité.
- MIK