Berechnen Sie die Unterschiede zwischen succesive Datensätze in Hadoop mit Hive-Abfragen

Habe ich eine Hive-Tabelle, die enthält Daten, die der Kunde fordert.
Einfachheit halber betrachten, es hat 2 Spalten, erste Spalte enthält die Kunden-ID und die zweite Spalte enthält den Zeitstempel des Aufrufs (unix-timestamp).

Ich kann eine Abfrage an diese Tabelle zu finden, die alle Aufrufe für jeden Kunden:

SELECT * FROM mytable SORT BY customer_id, call_time;

Ist das Ergebnis:

Customer1    timestamp11
Customer1    timestamp12
Customer1    timestamp13
Customer2    timestamp21
Customer3    timestamp31
Customer3    timestamp32
...

Ist es möglich, das erstellen einer Hive-Abfrage zurückgibt, für jeden Kunden, beginnend ab dem zweiten Aufruf, das Zeitintervall zwischen zwei succesive Anrufe?
Für das obige Beispiel, die Abfrage zurückgeben soll:

Customer1    timestamp12-timestamp11
Customer1    timestamp13-timestamp12
Customer3    timestamp32-timestamp31
...

Ich habe versucht, passen Sie die Lösungen aus der sql-Lösung, aber ich bin stecken mit dem Bienenkorb Einschränkungen: es akzeptiert Unterabfragen nur in AUS und joins enthalten muss, nur Gleichheit.

Danke.

EDIT1:

Habe ich versucht, ein Hive UDF-Funktion:

public class DeltaComputerUDF extends UDF {
private String previousCustomerId;
private long previousCallTime;

public String evaluate(String customerId, LongWritable callTime) {
    long callTimeValue = callTime.get();
    String timeDifference = null;

    if (customerId.equals(previousCustomerId)) {
        timeDifference = new Long(callTimeValue - previousCallTime).toString();
    }

    previousCustomerId = customerId;
    previousCallTime = callTimeValue;

    return timeDifference;
}}

und verwenden Sie es mit dem Namen "delta".

Aber es scheint (aus den Protokollen und Ergebnis), es ist verwendet bei der KARTE Zeit. 2 Probleme die sich daraus ergeben:

Erste: Die Daten der Tabelle muss sortiert werden, indem Sie Kunden-ID und timestamp-VOR der Verwendung dieser Funktion. Die Abfrage:

 SELECT customer_id, call_time, delta(customer_id, call_time) FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time;

funktioniert nicht, weil die Sortierung der Artikel erfolgt bei der REDUZIERUNG der Zeit, lange nach meiner Funktion verwendet wird.

Kann ich die Tabelle Sortieren Daten, bevor Sie die Funktion, aber ich bin nicht zufrieden mit diesem, weil es ist ein Aufwand, ich hoffe zu vermeiden.

Zweite: Im Falle einer verteilten Hadoop-Konfiguration werden die Daten aufgeteilt unter den verfügbaren job-Tracker. So, glaube ich, wird es mehrere Instanzen dieser Funktion, eine für jeden mapper, so ist es möglich, die gleichen Kundendaten split zwischen 2 Mapper. In diesem Fall werde ich verlieren, Kunden anrufen, die nicht akzeptabel ist.

Ich weiß nicht, wie dieses Problem zu lösen. Ich weiß, dass zu VERBREITEN, INDEM sichergestellt wird, dass alle Daten mit einem bestimmten Wert gesendet wird, um die gleiche reducer (so sicherzustellen, dass die ART funktioniert, wie erwartet), weiß jemand ob es etwas ähnliches für den mapper?

Nächsten I-plan zu Folgen libjack ' s Vorschlag, eine Reduzierung Skript. Diese "Berechnung" ist notwendig, zwischen einigen anderen hive-Abfragen, so will ich versuchen alles Hive bietet, bevor Sie zu einem anderen Werkzeug, wie vorgeschlagen, durch Balaswamy vaddeman.

EDIT2:

Begann ich zu untersuchen, die benutzerdefinierten Skripts Lösung. Aber, auf der ersten Seite des Kapitels 14 in der Programmierung mit Hive-Buch (dieses Kapitel zeigt die benutzerdefinierten Skripts), fand ich den folgenden Absatz:

Streaming ist in der Regel weniger effizient als die Kodierung der vergleichbaren UDFs oder
InputFormat Objekte. Serialisieren und Deserialisieren von Daten zu übergeben, die es in und
aus dem Rohr ist relativ ineffizient. Es ist auch schwieriger zu Debuggen die ganze
Programm in einer einheitlichen Art und Weise. Es ist jedoch nützlich für schnelles prototyping
und für die Wiederverwendung von vorhandenen code, der nicht in Java geschrieben. Für Hive
Benutzer, die nicht wollen, um das schreiben von Java-code, kann es eine sehr effektive
Ansatz.

So war es klar, dass die benutzerdefinierte Skripts ist nicht die beste Lösung in Bezug auf die Effizienz.

Aber wie sollte ich meine UDF-Funktion, aber stellen Sie sicher, dass es funktioniert wie erwartet in einem verteilten Hadoop-Konfiguration? Ich fand die Antwort auf diese Frage in der UDF-Internals-Abschnitt der Sprache Manual UDF wiki-Seite. Wenn ich Schreibe, meine Abfrage:

 SELECT customer_id, call_time, delta(customer_id, call_time) FROM (SELECT customer_id, call_time FROM mytable DISTRIBUTE BY customer_id SORT BY customer_id, call_time) t;

durchgeführt, ist auf die Zeit VERRINGERN und zu VERTEILEN, DURCH und SORTIEREN Konstrukte garantieren, dass alle Datensätze vom gleichen Kunden bearbeitet werden, die von den gleichen reducer, in der Reihenfolge der Anrufe.

So dass die oben genannten UDF und diese Abfrage konstruieren, die mein problem lösen.

(Sorry für die nicht das hinzufügen von links, aber ich bin nicht erlaubt, es zu tun, weil ich nicht genug Ruf-Punkte)

InformationsquelleAutor Cipi | 2013-02-01
Schreibe einen Kommentar