Hive gehört zum Hadoop Ökosystem und ermöglicht das Abfragen seiner Daten, die im HDFS liegen. Das HDFS ist das verteilte Dateisystem in Hadoop, das ermöglicht extrem große Datenmengen zu persistieren, indem diese verteilt auf dem Cluster abgelegt werden. Mit Hive wird eine Metastruktur auf den Daten erstellt, sodass eine SQL ähnliche Abfrage möglich wird, wobei automatisch die HiveQL in MapReduce-Jobs übersetzt wird. Man darf Hive nicht mit einer DBMS verwechseln, da nur die HiveQL an den SQL Standard 92 angelehnt ist und das auch nur für die Abfrage und nicht zum einzelnen Einfügen von Datensätzen oder dem Update von diesen.
In diesem Blogpost listen wir einige und kurze Learnings auf, die wir beim Nutzen von Hive hatten:
- GROUP BY muss alle Spalten beinhalten, die im Select vorkommen
- Ansonsten kann man mit dem struct-Konstrukt arbeiten
- BEI JOINs am besten die größere Tabelle links aufführen
- per Default werden die übersetzten MapReduce Programme nicht parallel ausgeführt
- kann man global einstellen, ist aber scheinbar nicht die Empfehlung
- Vor dem Ausführen der Query diese Einstellung mitgeben: “SET hive.exec.parallel = TRUE;”
- die Option “SET hive.exec.mode.local.auto = TRUE;” erlaubt Hive die Entscheidung, ob eine Abfrage lokal ausgeführt wird, wenn der Job klein genug ist oder die nachfolgenden Queries kleinere Ergebnisse haben, damit Netzwerkkommunikation gespart wird. Hier sind die Kriterien aufgelistet, wenn man nach der Option sucht.
- Bevor eine UDF geschrieben wird, überlegen ob diese nicht durch die HiveQL besser und performanter gemacht werden kann
- Spalte auswählen dessen Name eine Zahl ist: Spaltenname in Backticks angeben (Bsp: `600`)
- Spalten über eine Regex auswählen, z.B. nur Spalten die eine Zahl als Namen haben: “SET hive.support.quoted.identifiers = none; SELECT `([0-9]*)` FROM mytable;”
- Es gibt eine Hive-Syntax, um Queries direkt auf Table-Samples auszuführen, die deutlich performanter als z.B. “
SELECT
*
FROM
<tabelle>
distribute
by
rand()
sort
by
rand()
limit <Anzahl>;”, da bei solchen Queries immer zunächst die gesamte Tabelle durchsucht wird, mit der TABLESAMPLE Syntax jedoch von vornherein nur das Sample! -> https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Sampling