La sortie de commande HED INSERT OVERWRITE DIRECTORY n'est pas séparée par un délimiteur. Pourquoi?
Le fichier que je suis le chargement est séparé par des '' (espace blanc). Ci-dessous le fichier. Le fichier se trouve dans HDFS:-
001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007
1> je suis de la création d'une table externe et de charger le fichier en tapant la commande ci-dessous:-
CREATE EXTERNAL TABLE IF NOT EXISTS graph_edges (src_node_id STRING COMMENT 'Node ID of Source node', dest_node_id STRING COMMENT 'Node ID of Destination node') ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION '/user/hadoop/input';
2> Après cela, je suis tout simplement d'insérer le tableau dans un autre fichier en exécutant la commande ci-dessous:-
INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;
3> Maintenant, quand je chat le fichier, les champs ne sont pas séparés par un délimiteur:-
hadoop dfs -cat /user/hadoop/output/000000_0
De sortie:-
001000
001000
002001
003002
004003
005004
006005
007006
008007
099007
Quelqu'un peut-il m'aider? Pourquoi est-ce que le séparateur étant retiré et la façon de délimiter le fichier de sortie?
Dans la commande CREATE TABLE, j'ai essayé DELIMITED BY '\t'
mais alors je suis inutile colonne NULL.
Tous les pointeurs aider beaucoup apprécié. Je suis l'aide de la Ruche version 0.9.0.
source d'informationauteur Anuroop | 2013-05-09
Vous devez vous connecter pour publier un commentaire.
Le problème est que la RUCHE ne vous permet pas de spécifier le séparateur de sortie - https://issues.apache.org/jira/browse/HIVE-634
La solution est de créer une table externe pour la sortie (avec séparateur de spécification) et insérez-la réécriture de la table au lieu de répertoire.
--
En supposant que vous avez /utilisateur/hadoop/input/graph_edges.csv dans HDFS,
Revient comme ci-dessus, avec des espaces.
Je pense à l'aide de la concat_ws fonction, vous pouvez atteindre votre sortie;
ici, j'ai choisi virgule comme séparateur de colonne
Alors que la question est plus de 2 ans et le haut réponse est bonne à l'époque, il est maintenant possible de dire de la Ruche pour écrire des données délimitées à un répertoire.
Voici un exemple de sortie de données avec le traditionnel ^séparateur:
Et maintenant, avec l'onglet délimiteurs:
J'ai quelques voix différente.
En effet, la Ruche ne prend pas en charge séparateur personnalisé.
Mais lorsque vous utilisez
INSERT OVERWRITE DIRECTORY
il y a des séparateurs dans vos lignes. Le délimiteur est'\1'
.Vous pouvez utiliser
hadoop dfs -cat $file | head -1 | xxd
la trouver ou obtenir le fichier de HDFS sur la machine locale et de l'ouvrir avec vim. Il y aura un certain caractère comme '^A' dans votre vim qui est le délimiteur.Revenir à la question, Vous pouvez utiliser un simple moyen de les résoudre.
Toujours utiliser
INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
pour générer/user/hadoop/output
;Créer une table externe dont les champs sont délimités par des
'\1'
:Vous pouvez fournir séparateur lors de l'écriture dans les répertoires
Cela devrait fonctionner pour vous.
Le séparateur par défaut est "^A". En langage python, il est "\x01".
Lorsque je veux changer le séparateur, j'utilise SQL comme:
SELECT col1, séparateur, col2, séparateur, col3, ...,
À PARTIR de la table
Puis, séparateur+"^" comme un nouveau délimiteur.
Je soupçonne que la ruche est en fait l'écriture d'un contol-A comme séparateur, mais quand vous faites un chat à l'écran, il n'est pas à montrer à vos yeux.
Au lieu essayez de mettre le fichier à vi de la tête ou le fichier si vous ne voulez voir un peu de lui, et vi le résultat:
hadoop dfs -chat /utilisateur/hadoop/sortie/000000_0 | head > my_local_file.txt
vi my_local_file.txt
Vous devriez être en mesure de voir l ^Un des personnages.
J'ai eu ce problème où la sortie de la ruche, les résultats de la requête doit être la pipe délimité..
L'exécution de cette commande sed vous pouvez remplacer:
^A to |
sed 's#\x01#|#g' test.log > piped_test.log
Ce serait une meilleure solution, je suppose que si c'est un tout autour de manière à réaliser.
INSÉRER ÉCRASER le RÉPERTOIRE '/utilisateur/hadoop/de sortie", SÉLECTIONNEZ src_node_id,' ',dest_node_id DE graph_edges;
vous pouvez utiliser ce paramètre sur la ligne"format délimité par des fields terminated by '|'" par exemple dans votre cas doit être
INSÉRER ÉCRASER le RÉPERTOIRE '/utilisateur/hadoop/sortie de ligne format délimité par des fields terminated by '|' SELECT * from graph_edges;