2014-01-18 7 views
19

Gibt es eine Hive-Abfrage, um schnell die Tabellengröße (d. H. Anzahl der Zeilen) zu finden, ohne einen zeitaufwendigen MapReduce-Job zu starten? (Deshalb möchte ich vermeiden COUNT(*).)Hive-Abfrage zum schnellen Auffinden der Tabellengröße (Anzahl der Zeilen)

Ich versuchte DESCRIBE EXTENDED, aber das ergab numRows=0, die offensichtlich nicht korrekt ist.

(Entschuldigung für die newb Frage. Ich habe versucht, googeln und die apache.org Dokumentation ohne Erfolg zu suchen.)

+0

prüfen diese [link] (https://stackoverflow.com/a/45304801/7043815) !!! hoffe es hilft :) –

Antwort

22

tblproperties gibt die Größe der Tabelle an und kann verwendet werden, um genau diesen Wert bei Bedarf zu erfassen.

-- gives all properties 
show tblproperties yourTableName 

-- show just the raw data size 
show tblproperties yourTableName("rawDataSize") 
+1

Anscheinend funktioniert der angegebene Befehl nur, wenn diese Eigenschaften für die Spalte verfügbar sind, die nicht standardmäßig vorhanden ist. –

+0

@ Jared, was ist die Einheit? Byte? – Steven

+0

Ja, die Ausgabe ist Bytes. Dies funktioniert auch nur für nicht partitionierte Tabellen, auf denen Statistiken ausgeführt wurden. – Jared

-5

es ist eine gute Frage. Die Zählung () benötigt viel Zeit, um das Ergebnis zu finden. Aber leider zählen () ist nur eine Möglichkeit zu tun.

gibt es eine alternative Art und Weise (kann nicht sagen, alternative, aber besser als Latenz obigen Fall):

setzen die Eigenschaft Satz hive.exec.mode.local.auto = true;

und führen Sie den gleichen Befehl aus (wählen Sie count (*) from tbl), was eine bessere Latenz als bisher bietet. Hier

+0

Es gibt ja auch andere Möglichkeiten. Siehe die andere Antwort unten. –

20

ist die schnelle Befehl

ANALYZE TABLE tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)] COMPUTE STATISTICS [noscan]; 

Wenn zum Beispiel Tabelle partitioniert ist

hive> ANALYZE TABLE ops_bc_log PARTITION(day) COMPUTE STATISTICS noscan; 

Ausgang ist

Partition logdata.ops_bc_log {Tag = 20140523} Statistiken: [NumFiles = 37, numRows = 26095186, totalSize = 654249957, rawDataSize = 58080809507]

Teil ition logdata.ops_bc_log {Tag = 20140521} Statistiken: [NumFiles = 30, numRows = 21.363.807, Totalsize = 564.014.889, rawDataSize = 47556570705]

Partition logdata.ops_bc_log {Tag = 20140524} Statistiken: [NumFiles = 35, numRows = 25210367, Totalsize = 631424507, rawDataSize = 56083164109]

Partition logdata.ops_bc_log {Tag = 20140522} Statistiken: [NumFiles = 37, numRows = 26.295.075, Totalsize = 657.113.440, rawDataSize = 58496087068]

OK

Zeitaufwand: 5.252 Sekunden

+0

Hinweis: In der Dokumentation (https://cwiki.apache.org/confluence/display/Hive/StatsDev) verhindert der Parameter "noscan", dass die Dateien gescannt werden, um die Anzahl der Zeilen korrekt zu zählen. Sie werden jedoch Gesamtgröße bekommen.In deinem Fall hätte es vielleicht funktioniert, weil du Statistiken per Config gesammelt hast. –

+0

@DanielLangdon sind die Einheiten von RawDataSize Bytes, Blöcke oder etwas anderes? – dlamblin

-1

Verwenden Sie das Parkettformat, um Daten Ihrer externen/internen Tabelle zu speichern. Dann erhalten Sie schnellere Ergebnisse.

2

Wie wäre es mit:

hdfs dfs -du -s -h /path/to/table/name 
Verwandte Themen