wake-up-neo.com

So löschen und aktualisieren Sie einen Datensatz in Hive

Ich habe Hadoop, Hive, Hive JD BC installiert. die laufen gut für mich. Ich habe aber immer noch ein Problem. So löschen oder aktualisieren Sie einen einzelnen Datensatz mit Hive, da der Befehl zum Löschen oder Aktualisieren von MySQL in Hive nicht funktioniert.

Vielen Dank 

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

Sie sollten Hive nicht als reguläres RDBMS betrachten. Hive eignet sich besser für die Stapelverarbeitung über sehr große Mengen unveränderlicher Daten.

Folgendes gilt für Versionen vor Hive 0.14, für spätere Versionen siehe @ashtonium.

Es wird keine Operation zum Löschen oder Aktualisieren eines bestimmten Datensatzes oder einer bestimmten Datensatzgruppe unterstützt. Dies ist für mich eher ein Zeichen eines schlechten Schemas.

Hier finden Sie in der offiziellen Dokumentation :

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

Sie können diese Einschränkung umgehen, indem Sie Partitionen verwenden: Ich weiß nicht, was Ihnen id entspricht. Wenn Sie jedoch unterschiedliche Stapel von IDs erhalten, können Sie Ihre Tabelle so umgestalten, dass sie von partitioniert wird id, und dann könnten Sie Partitionen für die IDs, die Sie loswerden möchten, problemlos löschen.

58
Charles Menguy

Ab Hive-Version 0.14.0: INSERT ... VALUES, UPDATE und DELETE sind jetzt mit vollständiger ACID-Unterstützung verfügbar.

INSERT ... VALUES Syntax:

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

Dabei ist value_row: (Value [ value ...]) Wobei ein Wert entweder null oder ein gültiges SQL-Literal ist

UPDATE-Syntax:

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

DELETE-Syntax:

DELETE FROM tablename [WHERE expression]

Darüber hinaus aus dem Dokument Hive Transactions:

Wenn eine Tabelle in ACID-Schreibvorgängen verwendet werden soll (Einfügen, Aktualisieren, Löschen), muss die Tabelleneigenschaft "Transaktional" für diese Tabelle festgelegt werden, beginnend mit Hive 0.14.0. Ohne diesen Wert werden Einfügungen im alten Stil ausgeführt. Aktualisierungen und Löschungen sind nicht zulässig.

Hive DML-Referenz:
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+DML
Referenz für Hive-Transaktionen:
https://cwiki.Apache.org/confluence/display/Hive/Hive+Transactions

81
ashtonium

Ja, richtig gesagt. Hive unterstützt keine UPDATE-Option. Die folgende Alternative könnte jedoch zum Erreichen des Ergebnisses verwendet werden:

Aktualisieren Sie Datensätze in einem partitioned Hive table:

  1. Es wird angenommen, dass die Haupttabelle mit einem Schlüssel partitioniert ist.
  2. Laden Sie die inkrementellen Daten (die zu aktualisierenden Daten) in eine Staging-Tabelle, die mit denselben Schlüsseln wie die Haupttabelle partitioniert ist.
  3. Verbinden Sie die beiden Tabellen (Haupt- und Staging-Tabellen) mit einer LEFT OUTER JOIN-Operation wie folgt:

einfügung der überschreibenden Tabelle main_table Partition (c, d) wähle t2.a, t2.b, t2.c, t2.d aus staging_table t2 linker äußerer Join main_table t1 auf t1.a = t2.a;

Im obigen Beispiel werden main_table und staging_table mit den Schlüsseln (c, d) partitioniert. Die Tabellen werden über LEFT OUTER JOIN verbunden und das Ergebnis wird verwendet, um die Partitionen in der main_table zu überschreiben.

Ein ähnlicher Ansatz könnte auch beiun-partitioned Hive tableUPDATE-Operationen verwendet werden.

15
Sudeesh Kumar

Sie können Zeilen aus einer Tabelle mithilfe einer Problemumgehung löschen, in der Sie die Tabelle mit dem Dataset überschreiben, das Sie als Ergebnis Ihrer Operation in der Tabelle belassen möchten. 

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

Die Problemumgehung ist vor allem für Massenlöschungen von leicht identifizierbaren Zeilen hilfreich. Wenn Sie dies tun, können Ihre Daten natürlich auch verwirrt werden, so dass eine Sicherung der Tabelle empfohlen wird und die Planung der Löschregel mit Vorsicht geplant wird.

5
user11788

Wenn Sie alle Datensätze löschen möchten, laden Sie im Workover-Modus im OVERWRITE-Modus eine leere Datei in die Tabelle

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

Die CLI hat Ihnen mitgeteilt, wo Ihr Fehler liegt: delete WHAT? from student ...

Löschen: Wie kann ich Tabellen aus Hadoop-Hive löschen/kürzen?

Update: Update, SET-Option in Hive

3
Apaachee

Nachdem Sie Hive installiert und konfiguriert haben, erstellen Sie eine einfache Tabelle:

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

Versuchen Sie dann, einige Zeilen in die Testtabelle einzufügen.

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

Versuchen Sie nun, Datensätze zu löschen, die Sie gerade in die Tabelle eingefügt haben.

Hive>delete from testTable where id = 1;

Error! FEHLGESCHLAGEN: SemanticException [Fehler 10294]: Versuch, eine Aktualisierung oder ein Löschen mit dem Transaktionsmanager durchzuführen, der diese Vorgänge nicht unterstützt.

Standardmäßig sind Transaktionen deaktiviert. Es wurde gesagt, dass die Aktualisierung bei der im Konvertierungsmanager verwendeten Löschoperation nicht unterstützt wird. Um das Aktualisieren/Löschen zu unterstützen, müssen Sie die folgende Konfiguration ändern.

cd  $Hive_HOME
vi conf/Hive-site.xml

Fügen Sie der Datei die folgenden Eigenschaften hinzu

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

Starten Sie den Dienst neu und wiederholen Sie den Befehl delete:

Error!

FEHLGESCHLAGEN: LockException [Fehler 10280]: Fehler bei der Kommunikation mit dem Metastore.

Es gibt ein Problem mit dem Metastore. Um die Einfüge-/Aktualisierungs-/Löschoperation zu verwenden, müssen Sie die folgende Konfiguration in conf/Hive-site.xml ändern, da die Funktion derzeit in der Entwicklung ist.

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

Starten Sie den Dienst neu und löschen Sie den Befehl erneut:

Hive>delete from testTable where id = 1;

Error!

FEHLGESCHLAGEN: SemanticException [Fehler 10297]: Versuch, eine Aktualisierung oder Löschung für die Tabelle default.testTable durchzuführen, die kein AcidOutputFormat verwendet oder keine Buckets enthält.

In dieser ersten Version wird nur das ORC-Dateiformat unterstützt. Die Funktion wurde so konzipiert, dass Transaktionen von jedem Speicherformat verwendet werden können, das bestimmen kann, wie Aktualisierungen oder Löschvorgänge auf Basisdatensätze angewendet werden (im Grunde genommen mit einer expliziten oder impliziten Zeilen-ID). Bisher wurde die Integrationsarbeit jedoch nur für durchgeführt ORC.

Tabellen müssen mit Buckets versehen werden, um diese Funktionen nutzen zu können. Tabellen im selben System, die keine Transaktionen und keine ACID verwenden, müssen nicht gecockt werden.

Siehe unten Beispiel für eine erstellte Tabelle mit ORCFile-Format, aktiviertem Bucket und ('transactional' = 'true').

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

Einfügen:

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

Update:

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

Löschen:

Hive>delete from testTableNew where id = 1;

Prüfung :

Hive>select * from testTableNew ;
2
Devesh Sharma

Für INSERT, UPDATE, DELETE.__ einzustellende Konfigurationswerte. Zusätzlich zu den oben aufgelisteten neuen Parametern müssen einige vorhandene Parameter so festgelegt werden, dass sie INSERT ... VALUES, UPDATE und DELETE unterstützen.

Konfigurationsschlüssel Muss auf gesetzt sein

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)

Für die Verdichtung einzustellende Konfigurationswerte

Wenn sich die Daten in Ihrem System nicht im Besitz des Hive-Benutzers befinden (d. H. Des Benutzers, unter dem der Hive-Metastore ausgeführt wird), benötigt Hive die Berechtigung, als Benutzer ausgeführt zu werden, der die Daten besitzt, um Kompositionen ausführen zu können. Wenn Sie HiveServer2 bereits für die Identität von Benutzern eingerichtet haben, besteht die einzige zusätzliche Arbeit darin, sicherzustellen, dass Hive das Recht hat, Benutzer des Hosts zu sein, der den Hive-Metastore ausführt. Dies geschieht durch Hinzufügen des Hostnamens zu hadoop.proxyuser.Hive.hosts in der Hadoop-Datei core-site.xml. Wenn Sie dies noch nicht getan haben, müssen Sie Hive als Proxy-Benutzer konfigurieren. Dazu müssen Sie Keytabs für den Benutzer einrichten, der den Hive-Metastore ausführt, und die Dateien hadoop.proxyuser.Hive.hosts und hadoop.proxyuser.Hive.groups zur Hadoop-Datei core-site.xml hinzufügen. Weitere Informationen finden Sie in der Hadoop-Dokumentation zum sicheren Modus für Ihre Hadoop-Version (z. B. für Hadoop 2.5.1 bei Hadoop im sicheren Modus).

Die UPDATE-Anweisung hat die folgenden Einschränkungen:

Der Ausdruck in der WHERE-Klausel muss ein Ausdruck sein, der von einer Hive-SELECT-Klausel unterstützt wird.

Partitions- und Bucket-Spalten können nicht aktualisiert werden.

Die Abfragevektorisierung wird für UPDATE-Anweisungen automatisch deaktiviert. Aktualisierte Tabellen können jedoch immer noch mit Vektorisierung abgefragt werden.

Unterabfragen sind auf der rechten Seite der SET-Anweisung nicht zulässig.

Das folgende Beispiel veranschaulicht die korrekte Verwendung dieser Anweisung:

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

DELETE-Anweisung

Verwenden Sie die DELETE-Anweisung, um Daten zu löschen, die bereits in Apache Hive geschrieben wurden.

DELETE FROM tablename [WHERE expression]; 

Die DELETE-Anweisung hat folgende Einschränkung: Die Abfragevektorisierung wird für die DELETE-Operation automatisch deaktiviert. Tabellen mit gelöschten Daten können jedoch weiterhin mit Vektorisierung abgefragt werden.

Das folgende Beispiel veranschaulicht die korrekte Verwendung dieser Anweisung:

DELETE FROM students WHERE gpa <= 1,0; 

2
dilshad

Die kommende Version von Hive wird SET-basierte Aktualisierungs-/Löschvorgänge ermöglichen. Dies ist äußerst wichtig, wenn Sie versuchen, CRUD-Vorgänge für eine Reihe von Zeilen auszuführen, anstatt jeweils eine Zeile zu nehmen.

In der Zwischenzeit habe ich einen dynamischen, auf Partitionen basierenden Ansatz ausprobiert, der hier http://linkd.in/1Fq3wdb dokumentiert ist. 

Bitte prüfen Sie, ob es Ihren Bedürfnissen entspricht.

2
Devopam Mittra

UPDATE oder DELETE ein Datensatz ist in Hive nicht zulässig, INSERT INTO ist jedoch zulässig.
Ein Ausschnitt aus Hadoop: Der endgültige Leitfaden (3. Auflage) :

Aktualisierungen, Transaktionen und Indizes sind die Hauptpfeiler herkömmlicher Datenbanken. Bis vor kurzem wurden diese Funktionen jedoch nicht als Teil des Funktionsumfangs von Hive betrachtet. Dies liegt daran, dass Hive für die Verwendung von HDFS-Daten mithilfe von MapReduce entwickelt wurde. Hier werden vollständige Tabellenscans als Norm verwendet und eine Tabellenaktualisierung wird durch Umwandlung der Daten in eine neue Tabelle erreicht. Bei einer Data Warehousing-Anwendung, die große Teile des Datasets ausführt, funktioniert dies gut. 

Hive unterstützt keine Aktualisierungen (oder Löschvorgänge), aber INSERT INTO. Es ist also möglich, einer vorhandenen Tabelle neue Zeilen hinzuzufügen.

1
zeekvfu

Kürzlich suchte ich nach einer Lösung für ein ähnliches Problem. Apache Hive und Hadoop unterstützen keine Aktualisierungs-/Löschvorgänge. So ? Sie haben also zwei Möglichkeiten:

  1. Verwenden Sie eine Sicherungstabelle: Speichern Sie die gesamte Tabelle in einer Sicherungstabelle, kürzen Sie dann Ihre Eingabetabelle und schreiben Sie nur die Daten neu, für die Sie sich interessieren.
  2. Verwenden Sie Uber Hudi : Es handelt sich um ein von Uber erstelltes Framework, um die HDFS-Einschränkungen einschließlich Löschen und Aktualisieren aufzulösen. Sie können einen Blick in diesen Link werfen: https://eng.uber.com/hoodie/

ein Beispiel für Punkt 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: Wenn es sich bei der Eingabetabelle um eine externe Tabelle handelt, müssen Sie dem folgenden Link folgen: Wie kann eine partitionierte externe Tabelle in einer Struktur abgeschnitten werden?

0
Yardi

Um Ihre aktuellen Bedürfnisse zu erreichen, müssen Sie die folgende Abfrage starten

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

Dadurch wird die aktuelle Tabelle gelöscht und eine neue Tabelle mit demselben Namen mit allen Zeilen erstellt, mit Ausnahme der Zeilen, die Sie ausschließen/löschen möchten

Ich habe dies auf Hive 1.2.1 versucht 

0

Löschen wurde kürzlich in Hive-Version 0.14 hinzugefügt Das Löschen kann nur für Tabellen ausgeführt werden, die ACID unterstützen Nachfolgend finden Sie die Verknüpfung von Apache.

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

0
Abid

Gute Nachrichten, Insert-Updates und -Löschungen sind jetzt auf Hive/Impala mit Kudu möglich.

Sie müssen IMPALA/kudu verwenden, um die Tabellen zu pflegen und Datensätze einzufügen/aktualisieren/löschen. Details mit Beispielen finden Sie hier: insert-update-delete-on-hadoop

Bitte teilen Sie die Neuigkeiten, wenn Sie sich freuen.

-MIK

0
Mufaddal Kamdar