web-dev-qa-db-fra.com

Comment charger des données CSV avec entre guillemets et séparés par tabulation dans la table Hive?

J'essaie de charger des données à partir d'un fichier csv dans lequel les valeurs sont entourées de guillemets doubles "" "et séparées par des tabulations"\t ". Mais lorsque j'essaye de le charger dans Hive, il ne génère aucune erreur et les données sont chargées sans aucune erreur, mais je pense que toutes les données sont chargées dans une seule colonne et la plupart des valeurs affichées comme NULL. ci-dessous est mon instruction de création de table.

CREATE TABLE example
(
organization  STRING,
order BIGINT,
created_on  TIMESTAMP,
issue_date TIMESTAMP,
qty  INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' 
ESCAPED BY '"'
STORED AS TEXTFILE;

Échantillon de fichier d'entrée; -

 "Organization" "Order"  "Created on"   "issue_date"   "qty"
 "GB"   "111223"    "2015/02/06 00:00:00"   "2015/05/15 00:00:00"   "5"
 "UK"   "1110"  "2015/05/06 00:00:00"   "2015/06/1 00:00:00"   "51"

et instruction Load pour pousser les données dans la table Hive.

 LOAD DATA INPATH '/user/example.csv' OVERWRITE INTO TABLE example

Quel pourrait être le problème et comment puis-je ignorer l'en-tête du fichier. et si je supprime ESCAPED BY '"' de l'instruction create, son chargement dans les colonnes respectives mais toutes les valeurs sont entourées de guillemets doubles. Comment puis-je supprimer les guillemets doubles des valeurs et ignorer l'en-tête du fichier?

19
Sharad

Vous pouvez maintenant utiliser OpenCSVSerde qui vous permet de définir le caractère de séparation et d'échapper facilement aux guillemets environnants:

CREATE EXTERNAL TABLE example (
   organization  STRING,
   order BIGINT,
   created_on  TIMESTAMP,
   issue_date TIMESTAMP,
   qty  INT
)
ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "\""
)  
LOCATION '/your/folder/location/';
18
cheseaux

"Hive comprend désormais un OpenCSVSerde qui analysera correctement les champs cités sans ajouter de fichiers jars supplémentaires ou de regex sujettes aux erreurs et lentes."

ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'

source = Ben Doerr

Comment gérer les champs entre guillemets (CSV) lors de l'importation de données de S3 dans DynamoDB en utilisant EMR/Hive

0
user584583

Vous ne voulez pas utiliser escaped by, c'est pour les caractères d'échappement, pas pour les guillemets. Je ne pense pas que Hive supporte réellement les guillemets. Vous voudrez peut-être jeter un oeil à ce serde csv qui accepte une propriété quotechar.

De plus, si vous avez HUE, vous pouvez utiliser l'application Web du gestionnaire de métastore pour charger le CSV dans, cela traitera de la ligne d'en-tête, des types de données de colonne, etc.

0
maxymoo