2013-10-06 6 views
2

J'ai un fichier dont les colonnes sont délimitées par^A et les lignes délimitées par un nouveau caractère de ligne \ n.Délimiteur HIVE n^M issue

j'ai téléchargé sur HDFS puis créer la table dans Ruche en utilisant la commande comme ceci:

CREATE EXTERNAL TABLE 
IF NOT EXISTS 
html_sample 
(ts string, 
    url string, 
    html string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
LINES TERMINATED BY '\n' 
LOCATION '/tmp/directoryname/'; 

Cependant, quand je fais une déclaration de sélection pour cette table. Il s'est avéré être un gâchis.

Le tableau se présente comme suit:

ts    url     html 
10082013  http://url.com/01  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 
10092013  http://url.com/02  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 

Je suis retourné au fichier texte et trouvé qu'il existe plusieurs caractères^M dans le fichier, ce qui rend le traitement HIVE que^M comme caractère de nouvelle ligne. Lorsque j'ai créé le fichier pour la première fois, j'ai volontairement supprimé tout le nouveau caractère de ligne du code HTML pour garantir que chaque enregistrement est une ligne. Cependant, je ne peux pas comprendre comment le HIVE pourrait traiter un^M comme un caractère de nouvelle ligne. Comment puis-je contourner cela sans modifier mon fichier.

(je sais qu'il pourrait être possible de faire une substitution globale en VI ou sed ... mais ça ne fait pas pour moi que beaucoup de sens comment pourrait-Hive traiter^M comme \ n)

Répondre

5

^M est un moyen par lequel Vim affiche les fins de ligne Windows. est ici plus sur ce point: What does ^M character mean in Vim?

Et Ruche à son tour utilise TextInputFormat ce qui arrive à la traiter comme une terminaison de ligne valide. Selon les versions de Hadoop et de Hive que vous utilisez, il peut y avoir différentes façons de surmonter cela (de la modification d'une propriété dans la configuration à l'implémentation InputFormat personnalisée). Il suffit de trouver un moyen de spécifier explicitement séparateur.

Et oui, les lignes terminées par '\ n' ne font pas ce à quoi il ressemble. J'utilise Hive 0.11 et seule la valeur possible est en fait '\ n' pour cela, mais elle n'est pas promue à TextInputFormat

+2

Et voici un ticket de Hadoop qui résout le problème avec TextInputFormat. Peut-être que cela vous sera utile lors de la recherche d'une solution concrète https://issues.apache.org/jira/browse/MAPREDUCE-2254 – ybodnar

+1

merci pour la réponse, je me suis débrouillé en utilisant sed -e 's/^ M // g 'pour supprimer tout le^M existant dans mon fichier et cela semble fonctionner. Mais modifier le fichier de configuration est à coup sûr une solution à long terme. –