2016-07-29 15 views
1

Ich habe einen Anwendungsfall, in dem ich SQL-basierte Data Warehousing-Aktivitäten mithilfe von Hive implementieren muss.Hive-basierte Data Warehousing-Task - Sequenznummer zu Datensätzen hinzufügen

Die Software würde eine Reihe von CSV-Dateien generieren. Wenn es in die SQL-Tabelle transformiert wird, wird eine eindeutige ID namens Sitzung für jede CSV-Datei zugewiesen und in eine SQL-Tabelle geladen. Nehmen wir an, ich habe 3 Spalten in CSV-Dateien. Ich werde vier Spalten in der SQL-Tabelle haben, wobei die erste Spalte die Sitzung darstellt. Dies bedeutet, dass Werte, die in der ersten CSV-Datei gespeichert sind, in die SQL-Tabelle mit der Sessios-ID '1' geschrieben werden und Werte aus der zweiten CSV-Datei an die SQL-Tabelle mit der Sitzungs-ID '2' angehängt werden.

In Hive,

ich diese CSV-Dateien in hdfs Verzeichnis gespeichert und will eine hive Tabelle mit den zusätzlichen Spalten erstellen, die die Session-ID darstellen. Ich bin mir nicht sicher, wie ich es machen kann. Jede Hilfe oder Anhaltspunkt wird sehr geschätzt.

+0

Können Sie die Tabelle ohne die zusätzliche Spalte erstellen? Woher weiß der Computer, was die ID sein sollte? Haben Sie darüber nachgedacht, das Tagfile-Flag beim Lesen von Dateien zu verwenden (also fügen Sie den Namen der Datei als Spalte hinzu, anstatt eine ID hinzuzufügen) –

+0

Dies ist ein guter Vorschlag, das heißt, den Namen der Datei anstelle von Ich würde. Wenn ich jedoch meine HQL-Abfrage schreibe, wähle ich einige Werte aus mehreren Tabellen aus. In diesem Fall wird ein Fehler angezeigt, dass INPUT__FILE__NAME in mehr als einer Tabelle gefunden wird. Irgendeine Abhilfe hier? – Bala

+0

Ich habe es behoben. Es war ein einfacher Fehler in meiner Abfrage. Ich habe DISTINCT in der Abfrage vermisst. Vielen Dank. Ich werde immer noch die Sitzungen in einer separaten Tabelle speichern müssen, um zu verfolgen, welche Sitzung verarbeitet wird und welche nicht. Ich werde es mit Hilfe der separaten Tabelle tun. – Bala

Antwort

0

Try unten Ansätze:

Zufalls Sitzungs-ID:

  • auf der Quelldatenmenge externe Tabelle erstellen:

create external table staging (a string, b string, c string) location 'xyz';

  • Zuweisen einer eindeutigen ID für jede Zeile:

insert into table destination as select reflect("java.util.UUID", "randomUUID") AS session_id, s.* from staging;

unter Verwendung von Sequenznummer als Sitzungs-ID:

  • auf der Quelldatenmenge externe Tabelle erstellen:

create external table staging (a string, b string, c string) location 'xyz';

  • erste Lastdaten Zeit:

CREATE TABLE IF NOT EXISTS max_session_id (session_id int);

  • eine Sequenz-ID zu jedem Datensatz anfügen:

insert into table destination select cast(coalesce(t.session_id,0) + row_number() over() as INT) as session_id, t1.* from max_session_id t join destination t1 on 1=1;

  • max Sitzungs-ID in separater Tabelle pflegen:

DROP TABLE IF EXISTS tmp_max_session_id; CREATE TABLE tmp_max_session_id AS SELECT COALESCE(MAX(session_id), 0) AS session_id FROM destination;

INSERT OVERWRITE TABLE max_session_id SELECT * FROM tmp_max_session_id; 

, wenn Sie wollen eine gleiche Session-ID pro Datei markieren, dann jede Datei als Partition hinzuzufügen, können Sie speichern reflektieren ("java.util.UUID", "randomUUID") oder max_session_id in einer separaten Tabelle beim Hinzufügen der Partition verwenden Sie die neu generierte session_id als Partitions-ID.

+0

Vielen Dank für Ihren Vorschlag. Es ist ein gutes Lernen für mich. Es ist zwar nicht notwendig, für jeden Datensatz eine eindeutige ID zuzuweisen, aber für jede verarbeitete Datei muss eine Sequenznummer angegeben werden. Anstelle von INPUT__FILE__NAME möchte ich eine ganze Zahl sehen. Trotzdem nehme ich Ihre Eingaben für mein zukünftiges Bedürfnis. – Bala

+0

Sie können den zweiten Ansatz verwenden, um eine Sequenz-ID für jede Datei zu generieren und sie als Partition zu Ihrer Tabelle hinzuzufügen. –