2017-10-10 13 views
0

Je reçois les données d'une table de transfert. Je sélectionne toutes les données des colonnes de la table de transfert et les insère dans une table de base.Après insertion dans le fichier de la table de base ressemble à ci-dessous.Comment supprimer^A et N du fichier utilisant la ruche

val1^Aval2^Aval3^A\N^Aval4^A\N Mais j'ai besoin de données pour être comme ça.

val1 val2 val3 val4 

^Un fichier doit être supprimé du fichier et \ N doit être remplacé par un espace vide. Je veux réaliser ceci dans la ruche n'importe quelle aide est appréciée.

Répondre

1

La sortie de la ruche est écrit en utilisant un séparateur de champ, par ruche par défaut utilise le délimiteur CTRL-A, c'est-à-dire (^A). Donc, vous voyez ici le fichier de sortie avec^A caractères entre lui. Par défaut, les valeurs NULL sont écrites dans les fichiers de données car \ N et \ N dans les fichiers de données sont interprétés comme NULL lors de l'interrogation des données. Par conséquent, si vous ne voulez pas \ N dans le fichier de données de sortie, vous pouvez définir les valeurs par défaut pour ces types de données en utilisant la fonction COALESCE dans la ruche. La fonction COALESCE renvoie la valeur si elle n'est pas nulle et si elle est nulle, elle renvoie la valeur par défaut spécifiée.

Approche 1: Créez une table de base avec un délimiteur de champs '\ t', c'est-à-dire un onglet. Remplacez la propriété 'serialization.null.format' = '' dans l'instruction create table pour définir la valeur par défaut de la chaîne vide au lieu de \ N.

CREATE TABLE base_table (
column_1 BIGINT, 
column_2 STRING 
) ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
LOCATION '/tmp/base_table' 
TBLPROPERTIES('serialization.null.format'=''); 

Insérez ensuite les données dans le tableau à l'aide ci-dessous requête:

INSERT OVERWRITE TABLE base_table 
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"") 
FROM my_table 
[ some WHERE clause here] 

Le fichier de sortie, vous verrez sera avec onglet séparés et les valeurs \ N seront défini par défaut de type de champ.

Approche 2:

La première approche sera celle préférée. Dans cette approche, utiliser le répertoire Ecraser d'insertion sur la table de base et écrire la sortie dans le répertoire souhaité:

INSERT OVERWRITE LOCAL DIRECTORY '/home/user/my_table_output/' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' ESCAPED BY '"' LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
SELECT COALESCE(column_1, 0L), COALESCE(column_2,"") 
FROM base_table; 

Dans le répertoire de sortie, vous verrez la sortie au format prévu.

Approche 3:

À partir de votre explication, il semble que vous essayez de lire ce fichier de sortie et je suppose que vous lisez par le code MapReduce.

Vous pouvez utiliser le délimiteur '\ u0001' (utilisez le caractère d'échappement lors du codage, c'est-à-dire '\ u0001') pour diviser la chaîne d'entrée.

Lors du traitement de chaque ligne/champ, vous pouvez vérifier l'occurrence de la chaîne '\ N' et la remplacer par une valeur par défaut.

+0

Remercie Abhijeet pour l'aide. L'approche 1 fonctionne comme^A est inquiétant mais \ N est toujours là dans le dossier. – user1734980

+0

Avez-vous essayé d'utiliser COALESCE sur des champs? –

+0

J'ai mis à jour l'instruction 1 create table, remplacez la propriété de table 'serialization.null.format' = '' et cela résoudra votre problème. –

0

Vous pouvez utiliser regexp_replace pour cela. Par exemple, pour remplacer^A:

regexp_replace(<your column>,'\\^A',' ') 
+0

Cette fonction ne fonctionne pas. Toujours je vois le même fichier. – user1734980

0

Pour \ N

replace(column_name, "\\\N", " ") 

Pour^A

replace(column_name, "\\^A", "")