web-dev-qa-db-fra.com

comment obtenir le nom du fichier d'entrée sous forme de colonne dans la requête Hive

J'ai une table externe Hive mappée sur un répertoire. Ce répertoire comprend plusieurs fichiers.

Je veux exécuter une requête comme trouver un nom de fichier où il y a un utilisateur "abc"

 select file_name , usr from usrs_tables where usr = "abc"

Mais bien sûr, les données ne contiennent pas de nom de fichier à l'intérieur.

Dans MapReduce, je peux le faire en

FileSplit fileSplit = (FileSplit)context.getInputSplit();
String filename = fileSplit.getPath().getName();
System.out.println("File name "+filename);
System.out.println("Directory and File name"+fileSplit.getPath().toString());

Comment puis-je le faire dans Hive?

19
Julias

Oui, vous pouvez récupérer le fichier dans lequel l'enregistrement a été trouvé en utilisant la colonne virtuelle nommée INPUT__FILE__NAME, par exemple:

select INPUT__FILE__NAME, id, name from users where ...;

donne quelque chose comme:

hdfs://localhost.localdomain:8020/user/Hive/warehouse/users/users1.txt    2    user2
hdfs://localhost.localdomain:8020/user/Hive/warehouse/users/users2.txt    42    john.doe

Si nécessaire, utilisez les fonctions de chaîne fournies pour couper l'hôte et les répertoires de l'uri.

Vous pouvez trouver la documentation sur les colonnes virtuelles ici: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

43
jkovacs

Chaque table dans Hive a deux colonnes virtuelles. Elles sont

  1. INPUT__FILE__NAME
  2. BLOCK__OFFSET__INSIDE__FILE

INPUT__FILE__NAME donne le nom du fichier. BLOCK__OFFSET__INSIDE__FILE est la position actuelle du fichier global. Supposons que nous voulons trouver le nom du fichier correspondant à chaque enregistrement d'un fichier. Nous pouvons utiliser le INPUT__FILE__NAME colonne. Cette fonctionnalité est disponible à partir des versions Hive supérieures à 0.8. Un petit exemple est donné ci-dessous.

Requete

select INPUT__FILE__NAME, name from customer_data;

Cela nous donnera le nom de fichier correspondant à chaque enregistrement. Si vous souhaitez obtenir les noms de fichiers correspondant à une table Hive, la requête ci-dessous vous aidera.

select distinct(INPUT__FILE__NAME) from customer_data;
6
Maheswaran M

Hive 0.8.0 prend en charge deux colonnes virtuelles:

L'un est INPUT__FILE__NAME, qui est le nom du fichier d'entrée pour une tâche de mappage.

l'autre est BLOCK__OFFSET__INSIDE__FILE, qui est la position actuelle du fichier global.

Pour le fichier compressé par bloc, il s'agit du décalage de fichier du bloc actuel, qui est le décalage de fichier du premier octet du bloc actuel.

Depuis Hive 0.8.0, les colonnes virtuelles suivantes ont été ajoutées:

  • ROW__OFFSET__INSIDE__BLOCK
  • RAW__DATA__SIZE
  • ROW__ID
  • GROUPING__ID

Lien mis à jour sur les colonnes virtuelles dans Hive: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

3
david1977