web-dev-qa-db-fra.com

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

J'essaie d'utiliser EMR/Hive pour importer des données de S3 dans DynamoDB. Mon fichier CSV contient des champs entre guillemets doubles et séparés par une virgule . Lors de la création d'une table externe dans Hive, je peux spécifier le délimiteur comme virgule, mais comment puis-je spécifier que les champs sont placés entre guillemets?

Si je ne le spécifie pas, je constate que les valeurs dans DynamoDB sont renseignées entre deux guillemets doubles «« valeur »», ce qui semble être une erreur.

J'utilise la commande suivante pour créer une table externe. Est-il possible de spécifier que les champs sont placés entre guillemets?

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string)  ROW FORMAT DELIMITED FIELDS TERMINATED BY '","' LOCATION 's3://emrTest/folder';

Toutes les suggestions seraient appréciées . Merci Jitendra

17
RandomQuestion

Si vous êtes coincé avec le format de fichier CSV, vous devrez utiliser un SerDe personnalisé; et voici quelques travail basé sur le libarary opencsv .

Toutefois, si vous pouvez modifier les fichiers source, vous pouvez sélectionner un nouveau délimiteur afin que les champs cités ne soient pas nécessaires (bonne chance) ou réécrire pour que les virgules incorporées ne soient plus écrasées, par exemple. '\', qui peut être spécifié dans le ROW FORMAT avec ESCAPED BY:

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string)  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' LOCATION 's3://emrTest/folder';
3
libjack

Je suis également confronté au même problème car mes champs sont entourés de guillemets doubles et séparés par un point-virgule (;). Mon nom de table est employee1.

J'ai donc cherché avec des liens et j'ai trouvé la solution parfaite pour cela.

Nous devons utiliser serde pour cela. Veuillez télécharger serde jar en utilisant ce lien: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar

puis suivez les étapes ci-dessous en utilisant Hive Prompt:

add jar path/to/csv-serde.jar;

create table employee1(id string, name string, addr string)
row format serde 'com.bizo.Hive.serde.csv.CSVSerde'
with serdeproperties(
"separatorChar" = "\;",
"quoteChar" = "\"")
stored as textfile
;

puis chargez les données de votre chemin en utilisant la requête ci-dessous:

load data local inpath 'path/xyz.csv' into table employee1;

puis lancez:

select * from employee1;

Maintenant, vous allez voir la magie. Merci.

20
Cast_A_Way

Le code suivant a résolu le même type de problème 

CREATE TABLE TableRowCSV2(    
    CODE STRING,        
    PRODUCTCODE STRING, 
    PRICE STRING     
)
    COMMENT 'row data csv'    
ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'

WITH SERDEPROPERTIES (
   "separatorChar" = "\,",
   "quoteChar"     = "\""
)
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");
12
Shankar

Hive inclut maintenant une OpenCSVSerde qui analysera correctement les champs cités sans ajouter de jar ni de regex lent et sujet aux erreurs.

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

3
Ben Doerr

Hive ne prend pas en charge les chaînes entre guillemets. Il existe deux approches pour résoudre ce problème:

  1. Utilisez un séparateur de champ différent (un tuyau, par exemple).
  2. Ecrivez un InputFormat personnalisé basé sur OpenCSV.

L'approche la plus rapide (et sans doute la plus saine) consiste à modifier le processus d'exportation initial pour utiliser un délimiteur différent afin d'éviter les chaînes entre guillemets. De cette façon, vous pouvez dire à Hive d'utiliser une table externe avec un séparateur de tabulation ou de tuyau:

CREATE TABLE foo (
  col1 INT,
  col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
2
Jeremiah Peschka

Utilisez le fichier csv-serde-0.9.1.jar dans votre requête Hive, voir http://illyayalovyy.github.io/csv-serde/

add jar /path/to/jar_file

Create external table emrS3_import_1(col1 string, col2 string, col3 string, col4 string) row format serde 'com.bizo.Hive.serde.csv.CSVSerde'
with serdeproperties
(
  "separatorChar" = "\;",
  "quoteChar" = "\"
) stored as textfile
tblproperties("skip.header.line.count"="1") ---to skip if have any header file
LOCATION 's3://emrTest/folder';
1
Amit

Il peut y avoir plusieurs solutions à ce problème.

  1. Écrire une classe SerDe personnalisée
  2. Utilisez RegexSerde
  3. Supprimer les caractères de délimitation échappés des données

En savoir plus sur http://grokbase.com/t/Hive/user/117t2c6zhe/urgent-Hive-not-respecting-escaped-delimiter-characters

0
minhas23