Lors de la création d'une table externe dans la ruche puis-je signaler l'emplacement des fichiers spécifiques dans un répertoire?
J'ai défini une table en tant que tel:
create external table PageViews (Userid string, Page_View string)
partitioned by (ds string)
row format as delimited fields terminated by ','
stored as textfile location '/user/data';
Je ne veux pas tous les fichiers dans le dossier /user/répertoire de données pour être utilisés dans le cadre de la table. Est-il possible pour moi de faire ce qui suit?
location 'user/data/*.csv'
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur ce thread quand j'ai eu le même problème à résoudre. J'ai été en mesure de le résoudre en utilisant une mesure SerDe. J'ai ensuite ajouté SerDe propriétés qui ont guidé ce RegEx à appliquer pour le nom de fichier des modèles pour toute la table.
Personnalisé SerDe peut sembler exagéré si vous ne travailler qu'avec la norme de fichiers CSV, j'ai eu de plus en plus complexes format de fichier à traiter. C'est toujours un très solution viable si vous n'avez pas peur d'écrire du Java. Il est particulièrement utile lorsque vous sont pas en mesure de restructurer les données de votre emplacement de stockage et vous êtes à la recherche pour de très particulier, le modèle de fichier entre un très gros jeu de fichiers.
Ce kmosley dit est vrai. A partir de maintenant, vous ne pouvez pas choisir de façon sélective certains fichiers pour être une partie de votre table de la Ruche. Cependant, il y a 2 façons de les contourner.
Option 1:
Vous pouvez déplacer tous les fichiers csv dans un autre HDFS répertoire et créer un tableau de la Ruche sur le dessus de cela. Si cela fonctionne mieux pour vous, vous pouvez créer un sous-répertoire (par exemple, csv) dans votre répertoire qui contient tous les fichiers CSV. Vous pouvez ensuite créer un tableau de la Ruche sur le dessus de ce sous-répertoire. Gardez à l'esprit que tout Ruche tables créée sur le répertoire parent ne contiennent PAS les données depuis le sous-répertoire.
Option 2:
Vous pouvez modifier vos requêtes pour les utiliser une colonne virtuelle appelée
INPUT__FILE__NAME
.Votre requête devrait ressembler à quelque chose comme:
Le mauvais effet de cette approche est que la requête de la Ruche sera à multiplier par le biais de tout les données présentes dans le répertoire même si vous ne se souciait des fichiers spécifiques. La requête ne filtre pas les fichiers en fonction du prédicat à l'aide de
INPUT__FILE__NAME
. Il suffit de filtrer les enregistrements qui ne viennent pas de match le prédicat à l'aide deINPUT__FILE__NAME
au cours de la carte de phase (par conséquent, le filtrage de tous les enregistrements de fichiers en particulier), mais les mappeurs fonctionne sur les fichiers inutiles ainsi. Il vous donnera le résultat correct, pourraient avoir certains, probablement mineur, les performances de surcharge.L'avantage de cette approche est que vous pouvez utiliser la même table de la Ruche si vous aviez plusieurs fichiers dans votre table et que vous vouliez la possibilité d'interroger tous les fichiers à partir de ce tableau (ou partition) en quelques requêtes et d'un sous-ensemble des fichiers dans d'autres requêtes. Vous pourriez faire usage de la
INPUT__FILE__NAME
colonne virtuelle pour y parvenir. À titre d'exemple:si une partition de votre HDFS répertoire
/user/hive/warehouse/web_logs/
ressemblait:Disons que votre définition de la table ressemblait à:
Après l'ajout de partitions appropriées, vous pouvez lancer une requête sur tous les journaux dans la partition à l'aide d'une requête comme:
Cependant, si l'on ne se souciait de journaux à partir de la première heure de la journée, vous pouvez lancer une requête sur les journaux de la première heure à l'aide d'une requête comme:
Une autre utilisation similaire de cas pourrait être un répertoire qui contient les journaux web à partir de différents domaines et différentes requêtes doivent analyser des journaux sur différents ensembles de domaines. Les requêtes peuvent filtrer les domaines à l'aide de la
INPUT__FILE__NAME
colonne virtuelle.Dans les deux cas d'utilisation, d'avoir une sous-partition de l'heure ou de domaine permettrait de résoudre le problème, sans avoir à utiliser la colonne virtuelle. Cependant, il peut y avoir certains des compromis de conception qui vous obligent à ne pas créer des sous-partitions. Dans ce cas, sans doute, à l'aide de
INPUT__FILE__NAME
colonne virtuelle est votre meilleur pari.Décider entre les 2 options:
Cela dépend vraiment de votre cas d'utilisation. Si jamais vous n'soins sur tous les fichiers qui sont que vous essayez d'exclure de la table de la Ruche, à l'aide de l'Option 2 est probablement exagéré, et vous devriez corriger la structure de répertoire et de créer un tableau de la Ruche sur le dessus du répertoire contenant les fichiers que vous vous souciez.
Si les fichiers que vous sont actuellement à l'exclusion de suivre le même format que les autres fichiers (de sorte qu'ils peuvent tous faire partie de la même table de la Ruche) et vous pouvez le voir vous-même d'écrire une requête qui permettrait d'analyser toutes les données dans le répertoire, puis allez à l'Option 2.
INPUT__FILE__NAME
. Encore faut analyser toutes les données, mais peut être pratique tout de même... surtout quand vous ne voulez pas/avoir/ne peut pas partitionNon, vous ne peut actuellement le faire. Il y a un JIRA billet ouvert pour permettre aux regex sélection de fichiers inclus pour la Ruche tables (https://issues.apache.org/jira/browse/HIVE-951).
Pour l'instant, votre meilleur pari est de créer un tableau sur un répertoire différent et il suffit de copier les fichiers que vous souhaitez interroger.