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?
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? –
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. –
@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