Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
SerDe Open CSV pour le traitement de données CSV
Utilisez la bibliothèque SerDe Open CSV pour créer des tables Athena à partir de données séparées par des virgules (CSV).
Nom de la bibliothèque de sérialisation
La bibliothèque de sérialisation pour le SerDe Open CSV est nommée org.apache.hadoop.hive.serde2.OpenCSVSerde. Pour plus d’informations sur le code source, consultez CSV SerDe
Utilisation du SerDe Open CSV
Pour utiliser ce SerDe, spécifiez son nom de classe complet après ROW FORMAT
SERDE. Spécifiez également les délimiteurs dans SERDEPROPERTIES, comme illustré dans l’exemple ci-dessous.
... ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
Ignorer les en-têtes
Pour ignorer les en-têtes dans vos données lorsque vous définissez une table, vous pouvez utiliser la propriété de table skip.header.line.count, comme dans l'exemple suivant.
TBLPROPERTIES ("skip.header.line.count"="1")
Pour des exemples, voir les instructions CREATE TABLE dans Interrogation des journaux de flux Amazon VPC et Interrogation des journaux Amazon CloudFront.
Utilisation de la valeur NULL pour les données non valides
Pour utiliser des valeurs NULL pour les données dont la désérialisation dans le type défini pour la colonne échoue, vous pouvez utiliser la propriété de table use.null.for.invalid.data, comme illustré dans l’exemple suivant.
TBLPROPERTIES ("skip.header.line.count"="1")
Important
La définition de use.null.for.invalid.data sur TRUE peut entraîner des résultats incorrects ou inattendus, car les valeurs NULL remplacent les données non valides dans les colonnes présentant des problèmes de correspondance de schéma. Il est préférable de corriger les données dans vos fichiers ou votre schéma de table que d’activer cette propriété. Lorsque vous activez cette propriété, les données non valides n’entraînent pas l’échec des requêtes, ce qui peut vous empêcher de déceler des problèmes de qualité des données.
Considérations relatives aux données de type chaîne
Le SerDe Open CSV présente les caractéristiques suivantes pour les données de type chaîne :
-
Utilise des guillemets (
") en tant que caractère par défaut et vous permet de spécifier des séparateurs, des guillemets et des caractères d'échappement, tels que :WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" ) -
Vous ne pouvez pas échapper directement
\tou\n. Pour ce faire, utilisez"escapeChar" = "\\". Pour obtenir un exemple, consultez Example: Escaping \t or \n. -
Le SerDe Open CSV ne prend pas en charge les sauts de ligne imbriqués dans les fichiers CSV.
Considérations relatives aux données d’un type autre que chaîne
Pour les types de données autres que STRING, le SerDe Open CSV se comporte comme suit :
-
Reconnaît les de données
BOOLEAN,BIGINT,INTetDOUBLE. -
Ne reconnaît pas les valeurs vides ou nulles dans les colonnes définies en tant que type de données numériques, et les conserve en tant que
string. Une solution consiste à créer la colonne avec les valeurs nulles en tant questringet utiliser ensuiteCASTpour convertir le champ dans une requête en un type de données numérique, en fournissant une valeur par défaut de0pour les valeurs nulles. Pour plus d'informations, consultez la rubrique Lorsque j'interroge des données CSV dans Athena, je reçois l'erreur HIVE_BAD_DATA : erreur d'analyse de la valeur du champdans le Centre de connaissances AWS. -
Pour les colonnes spécifiées avec le type de données
timestampdans votre instructionCREATE TABLE, il reconnaît les donnéesTIMESTAMPsi elles sont spécifiées dans le format numérique UNIX en millisecondes, par exemple,1579059880000. Pour obtenir un exemple, consultez Example: Using the TIMESTAMP type and DATE type specified in the UNIX numeric format.-
Le SerDe Open CSV ne prend pas en charge
TIMESTAMPdans le formatjava.sql.Timestampcompatible avec JDBC, comme"YYYY-MM-DD HH:MM:SS.fffffffff"(précision de neuf décimales).
-
-
Pour les colonnes spécifiées avec le type de données
DATEdans votre instructionCREATE TABLE, il reconnaît les valeurs comme des dates si les valeurs représentent le nombre de jours qui se sont écoulés depuis le 1er janvier 1970. Par exemple, la valeur18276dans une colonne avec le type de donnéesdateest rendue comme2020-01-15lorsqu'elle est interrogée. Dans ce format UNIX, chaque jour est considéré comme ayant 86 400 secondes.-
Le SerDe Open CSV ne prend pas directement en charge
DATEdans un autre format. Pour traiter les données d'horodatage dans d'autres formats, vous pouvez définir la colonne commestringet ensuite utiliser les fonctions de conversion de temps pour retourner les résultats souhaités dans votre requêteSELECT. Pour plus d'informations, consultez l'article Lorsque j'interroge une table dans Amazon Athena, le résultat TIMESTAMP est videdans le Centre de connaissances AWS .
-
-
Pour mieux convertir les colonnes en le type souhaité dans une table, vous pouvez créer une vue sur la table et utiliser
CASTpour la conversion.
Exemples
Exemple : Interrogation de données CSV simples
L’exemple suivant suppose que vous avez enregistré des données CSV dans s3://amzn-s3-demo-bucket/mycsv/ avec le contenu suivant :
"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"Utilisez une instruction CREATE TABLE pour créer une table Athena basée sur les données. Référencez OpenCSVSerde (notez la lettre « d » minuscule) après ROW FORMAT SERDE et spécifiez le caractère de séparation, le caractère de guillemet et le caractère d’échappement dans WITH SERDEPROPERTIES, comme illustré dans l’exemple suivant.
CREATE EXTERNAL TABLE myopencsvtable ( col1 string, col2 string, col3 string, col4 string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '"', 'escapeChar' = '\\' ) STORED AS TEXTFILE LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
Interrogez toutes les valeurs de la table :
SELECT * FROM myopencsvtable;
La requête renvoie les valeurs suivantes :
col1 col2 col3 col4
-----------------------------
a1 a2 a3 a4
1 2 abc def
a a1 abc3 ab4Exemple : Utilisation des types TIMESTAMP et DATE spécifiés au format numérique UNIX
Considérez les trois colonnes suivantes de données séparées par des virgules. Les valeurs de chaque colonne sont placées entre guillemets.
"unixvalue creationdate 18276 creationdatetime 1579059880000","18276","1579059880000"
L'instruction suivante crée une table dans Athena à partir de l'emplacement du compartiment Simple Storage Service (Amazon S3) spécifié.
CREATE EXTERNAL TABLE IF NOT EXISTS testtimestamp1( `profile_id` string, `creationdate` date, `creationdatetime` timestamp ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' LOCATION 's3://amzn-s3-demo-bucket'
Ensuite, exécutez la requête suivante :
SELECT * FROM testtimestamp1
La requête renvoie le résultat suivant, affichant les données de date et d'heure :
profile_id creationdate creationdatetime unixvalue creationdate 18276 creationdatetime 1579146280000 2020-01-15 2020-01-15 03:44:40.000
Exemple : Échappement de \t ou \n
Examinez les données de test suivantes :
" \\t\\t\\n 123 \\t\\t\\n ",abc " 456 ",xyz
L'instruction suivante crée une table dans Athena, en spécifiant que "escapeChar" = "\\".
CREATE EXTERNAL TABLE test1 ( f1 string, s2 string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") LOCATION 's3://amzn-s3-demo-bucket/dataset/test1/'
Ensuite, exécutez la requête suivante :
SELECT * FROM test1;
Elle renvoie ce résultat, en échappant correctement \t ou \n :
f1 s2 \t\t\n 123 \t\t\n abc 456 xyz