Amélioration de vos requêtes ruche avec des index

Création d'un index est une pratique courante avec les bases de données relationnelles quand vous voulez accélérer l'accès à une colonne ou un ensemble de colonnes dans votre base de données. Sans index, le système de base de données doit lire toutes les lignes de la table pour trouver les données que vous avez sélectionné. Indices deviennent encore plus essentielles lorsque les tables se développent extrêmement large, et comme vous le savez sans doute maintenant, ruche prospère sur de grandes tables.

Comme on peut s'y attendre, la ruche soutient la création d'index sur les tables, mais sa fonctionnalité est encore un peu immature. Cependant, la communauté Hive est actif, et l'indexation finira par mûrir. Même avec ses limites actuelles, l'indexation offre une approche pour accélérer les requêtes de la ruche avec peu d'effort.

Vous pouvez optimiser les requêtes Hive dans au moins cinq façons: d'abord, avec un peu de recherche, vous pouvez souvent accélérer vos jointures en tirant parti de certaines techniques d'optimisation, tel que décrit sur le wiki Hive. Deuxièmement, les options de stockage en colonnes peut être très utile. Rappelez-vous que le format de fichier ORC est nouveau à partir de 0,11 Hive.

Troisièmement, vous pouvez partitionner les tables. Quatrièmement, la communauté Hive a fourni indexation. Enfin, ne pas oublier le hive.exec.mode.local.auto configuration variable.

En voici les étapes nécessaires à l'index de la FlightInfo2008 table. Cette très grande table a des millions de lignes, il est donc un bon candidat pour un indice ou deux.




(A) CREATE INDEX f08_index SUR TABLE flightinfo2008 (Origine) AS 'compact' AVEC recons- reportés (B) ALTER INDEX ON flightinfo2008 f08_index recons- (C) ruche (Données de vol)> VOIR index sur FlightInfo2008-OKf08indexflightinfo2008 origine flightdata__flightinfo2008_f08index__ compactTime prise: 0,079 secondes, récupérés: 1 rangée (s) (D) ruche (Données de vol)> DESCRIBE flightdata__flightinfo2008_f08index __- OKorigin chaîne string_offsetsarray None_bucketnameTemps nécessaire: 0.112 secondes, récupérés: 3 rangée (s) (E) ruche (Données de vol)> Origine SELECT COUNT (1) DE flightinfo2008 où le groupe Origine = 'SYR' PAR Origine-SYR 12032Time prise: 17.34 secondes, récupérés: 1 ligne (s) (F) ruche (Données de vol)> d'origine SELECT, TAILLE (`_offsets`) DE flightdata__flightinfo2008_f08index__ où l'origine = 'SYR'-SYR 12032Time prise: 8.347 secondes, récupérés: 1 rangée (s) (G) ruche (Données de vol )> DESCRIBE flightdata__flightinfo2008_f08index __- chaîne OKorigin string_offsetsarray None_bucketnameTemps nécessaire: 0,12 secondes, récupérés: 3 rangée (s)

L'étape (A) crée l'index en utilisant le 'COMPACT«Gestionnaire de l'indice sur le Provenance colonne. Hive propose également un gestionnaire d'index bitmap à la version 0.8, qui est destiné à la création d'index sur les colonnes avec quelques valeurs uniques.

Dans l'étape (A) les mots-clés À traitement différé RECONSTRUIRE Hive charge de créer d'abord une étape indexation vide (B) est l'endroit où vous avez réellement construire l'indice avec le ALTER INDEX ... REBUILD commande. Indice différé construit peut être très utile dans les workflows où l'on processus crée les tables et les index, une autre charge les données et construit les index et un processus final effectue une analyse de données.

Hive ne fournit pas la maintenance des index automatique, si vous avez besoin de reconstruire l'index si vous écrasez ou ajouter des données à la table. En outre, les indices de la ruche en charge les partitions de table, donc un reconstruire peut être limitée à une partition. Etape (C) illustre comment vous pouvez lister ou de montrer les index créés sur une table particulière.

Etape (D) illustre un point important concernant les indices de la ruche: les indices de la ruche sont mises en œuvre sous forme de tableaux. Voilà pourquoi vous devez d'abord créer la table d'index, puis le construire pour remplir la table. Par conséquent, vous pouvez utiliser des index dans au moins deux façons:

  • Comptez sur le système à utiliser automatiquement des index que vous créez.

  • Réécrire certaines requêtes de tirer parti de la nouvelle table d'index.

L'utilisation automatique des index progresse, mais cet aspect est un travail en cours. Se concentrer sur la deuxième option, l'étape (e), vous écrivez une requête qui vise à déterminer combien de vols ont quitté l'aéroport de Syracuse en 2008. Pour obtenir cette information, vous tirer parti de la COUNT fonction d'agrégation.

Vous pouvez voir que la ruche a pris 17,32 secondes sur la machine virtuelle de signaler que 12,032 vols provenaient de Syracuse, New York.

Dans l'étape (F), à tirer parti de la nouvelle table d'index et utilisez le TAILLE fonctionner à la place. Etape (F) est plus logique après vous étudiez l'étape (D): l'étape (D) vous montre ce qu'est une table d'index ressemble, où les dossiers détiennent chacun la colonne _bucketname, qui est l'emplacement des données dans l'entrepôt ruche (/ home / BiAdmin / ruche / entrepôt, dans ce cas), et une _offsets tableau, ce qui est l'indice dans la table (FlightInfo2008) dans ce cas.

Alors maintenant, la requête à l'étape (F) fait sens. Tous Hive a à faire est de trouver le SYR origine (Syracuse) dans le flightdata__flightinfo2008_f08index__ Table et puis de compter les lignes de la _offsets' tableau pour obtenir le nombre de vols - une façon simple et élégante à doubler le rendement (8.347 secondes à l'étape (F) contre 17,34 en Pas (E)) de la requête d'origine.


» » » » Amélioration de vos requêtes ruche avec des index