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?
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
Chaque table dans Hive a deux colonnes virtuelles. Elles sont
INPUT__FILE__NAME
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;
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