2016-07-15 42 views
3

Gibt es eine zuverlässige und effiziente Möglichkeit, sicherzustellen, dass Impala-Abfrageergebnisse vollständig umgesetzt werden, ohne dass die Druckergebnisse auf der Konsole angezeigt werden? Als Beispiel werde ich INNER JOIN Abfrage verwenden.Sicherstellen, dass die Impala-Abfrage materialisiert wird

Die offensichtliche Möglichkeit, Abfrageergebnisse zu materialisieren, ist Tabelle als auswählen erstellen.

CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id; 

Das Problem damit ist, dass es auf eine Disc schreibt, ist daher ineffizient. Ich bin auf der Suche nach der effizientesten Möglichkeit, Abfragen auszuführen und sicherzustellen, dass die Ergebnisse materialisiert werden.

Als Beispiel, in Spark kann ich .cache Methode gefolgt von .count verwenden, um sicherzustellen, dass die Abfrage materialisiert wird.

val t3 = t1.join(t2, "id") 
t3.cache 
t3.count 

ich Abhilfe mit Unter Abfrage versuchen könnte.

SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3; 

Aber noch muss ich die Unterabfrage, um sicherzustellen, materialisiert, die, wenn Abfrageoptimierer nicht offensichtlich ist entdeckt, dass ich in Gesamtzahl nur daran interessiert bin. Vielleicht gibt es einige Hinweise, um diese oder andere Tricks durchzusetzen?

+0

Sie möchten, dass eine Abfrage materialisiert wird, die Abfrage jedoch nicht materialisiert werden soll (d. H. Daten bleiben auf der Festplatte erhalten). Ich sehe dort eine Art Widerspruch. Oder wollen Sie einfach die Impala-Dämonen stress-testen, nur um zu sehen, an welchem ​​Punkt sie mit OOM aufgeben? –

+0

Mit anderen Worten: Impala ist eine SQL-Ausführungsmaschine, kein Datenverarbeitungs-Framework (* à la * Spark), kein verteilter Cache (* à la * Redis). Wenn eine Abfrage ausgeführt wurde, bleibt nichts übrig. Außer ein paar Protokolle. –

+0

@SamsonScharfrichter danke für den Kommentar, in vielen SQL db können Sie Abfrageergebnisse in Ad-hoc-Variable speichern und weiterverwenden. Wenn Impala eine solche Eigenschaft hätte, würde sie meinen Fall lösen. Ich möchte die Abfrage materialisieren, aber ich möchte nicht Ergebnis senden/drucken Overhead, so dass die 'Select count (*)' äußere Abfrage - viel besser als * create table as select *. Ich glaube nicht, dass es einen Widerspruch gibt. Nur ein genaues Timing der Abfrageausführung auf Serverseite. – jangorecki

Antwort

1

AFAIK können Sie das mit Impala nicht tun, und wird es nie können.
Cloudera entwickelte dieses Tool speziell zur Unterstützung von BI-Tools wie Tableau, Qlik, MicroStrategy usw. - jedoch nicht zur Unterstützung von ad hoc ETL-Skripten.

Auf der anderen Seite Hive wird jetzt mit einer "HPL-SQL" prozeduralen Sprache Wrapper, die Ihre Bedürfnisse passen könnte. Vorsichtsmaßnahmen:

  • erfordert Hive 2.0+
  • erfordert Ihr ganzes Skript innerhalb das HPL-SQL-Interpreter ausgeführt wird, nicht die Basis Hive-Client (noch eine Standard-JDBC-Verbindung)

Und die HPL-SQL-Tool behauptet, dass es auch Impala-Abfragen unterstützt, aber ich habe diesen Anspruch nie untersucht. Könnte dein Problem lösen, als eine Art unbeholfener Workaround.

Referenzen:
    HIVE-11055 (PL/HQL-Tool zum Hive Codebasis beigetragen)
    HPL/SQL website


Apropos Abhilfen, warum Funken nicht verwenden, wie Sie selbst vorgeschlagen ? Sie können die Impala/Hive-Tabellen entweder mit nativen Parkt-Bibliotheken von Spark oder mit einer benutzerdefinierten JDBC-Verbindung zu einem Impala-Daemon lesen.Im Wesentlichen würde es einer HPL/SQL-Lösung ähnlich sein.

+0

Danke, gut beantwortet.Ich werde mit Bounty eine Weile warten.Ich benutze bereits Spark im Benchmark, wollte Impala genauer widerspiegeln.Seht aus, als ob der beste Weg darin besteht, zwei verschiedene Abfragen zu testen, "Auswahl zählen (*)" und "Tabelle als Auswahl erstellen", damit der Leser das gewünschte Maß für seinen Anwendungsfall verwenden kann. – jangorecki