Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
OpenCSV per l'elaborazione di file SerDe CSV
Quando crei una tabella Athena per dati CSV, determina la tabella SerDe da utilizzare in base ai tipi di valori contenuti nei dati:
-
Se i tuoi dati contengono valori racchiusi tra virgolette doppie (
"
), puoi usare SerDeOpenCSVper deserializzare i valori in Athena. Se i tuoi dati non contengono valori racchiusi tra virgolette doppie () "
, puoi omettere di specificarne uno. SerDe In questo caso, Athena impiega ilLazySimpleSerDe
predefinito. Per informazioni, consulta LazySimpleSerDe per CSV, TSV e file delimitati in modo personalizzato. -
Se i tuoi dati hanno
TIMESTAMP
valori numerici UNIX (ad esempio,1579059880000
), usa OpenCSV. SerDe Se i tuoi dati utilizzano il formato, usa il.java.sql.Timestamp
LazySimpleSerDe
CSV SerDe (SerDeOpenCSV)
SerDeOpenCSV
-
Utilizza doppie virgolette (
"
) come virgolette predefinite e consente di specificare separatore, virgolette e caratteri di escape, ad esempio:WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
-
Impossibile utilizzare direttamente il carattere di escape
\t
o\n
. Per utilizzarli come caratteri di escape, utilizza"escapeChar" = "\\"
. Consulta l'esempio riportato in questo argomento. -
Non supporta le interruzioni di linea incorporate nei file CSV.
Per tipi di dati diversi daSTRING
, OpenCSV si comporta come SerDe segue:
-
Riconosce i tipi di dati
BOOLEAN
,BIGINT
,INT
eDOUBLE
. -
Non riconosce valori vuoti o nulli nelle colonne definite come un tipo di dati numerici, lasciandoli come
string
. Una soluzione alternativa è creare la colonna con i valori nulli comestring
e quindi utilizzareCAST
per convertire il campo in una query per un tipo di dati numerico, fornendo un valore predefinito0
per i valori nulli. Per ulteriori informazioni, consulta Quando eseguo una query sui dati CSV in Athena, ricevo l'errore HIVE_BAD_DATA: errore nell'analisi del valore del campo nel Knowledge Center. AWS -
Per le colonne specificate con il tipo di dati
timestamp
nell'istruzioneCREATE TABLE
, riconosce i datiTIMESTAMP
se sono specificati nel formato numerico UNIX in millisecondi, ad esempio1579059880000
.-
OpenCSV non
TIMESTAMP
supporta il SerDe formatojava.sql.Timestamp
compatibile con JDBC, ad esempio (precisione a 9 cifre decimali)."YYYY-MM-DD HH:MM:SS.fffffffff"
-
-
Per le colonne specificate con il tipo di dati
DATE
nell'istruzioneCREATE TABLE
, riconosce i valori come date se i valori rappresentano il numero di giorni trascorsi dal 1° gennaio 1970. Ad esempio, il valore18276
in una colonna con il tipo di datidate
viene eseguito come2020-01-15
quando viene interrogato. In questo formato UNIX, si considera che ogni giorno abbia 86.400 secondi.-
OpenCSV non
DATE
supporta SerDe direttamente nessun altro formato. Per elaborare i dati della marca temporale in altri formati, è possibile definire la colonna comestring
e quindi utilizzare le funzioni di conversione del tempo per restituire i risultati desiderati nella querySELECT
. Per ulteriori informazioni, consulta l'articolo Quando eseguo una query su una tabella in Amazon Athena, il risultato TIMESTAMP è vuotonel Portale del sapere di AWS .
-
-
Per convertire ulteriormente le colonne nel tipo desiderato in una tabella, è possibile creare una vista della tabella e utilizzare
CAST
per convertirle nel tipo desiderato.
Esempio: utilizzo del tipo TIMESTAMP e del tipo DATE specificati nel formato numerico UNIX.
Considerare le tre seguenti colonne di dati separati da virgole. I valori in ciascuna colonna sono racchiusi tra virgolette doppie.
"unixvalue creationdate 18276 creationdatetime 1579059880000","18276","1579059880000"
L'istruzione seguente crea una tabella in Athena dal percorso del bucket Amazon S3.
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://DOC-EXAMPLE-BUCKET'
Esegui quindi la seguente query:
SELECT * FROM testtimestamp1
La query restituisce il seguente risultato, mostrando i dati di data e ora:
profile_id creationdate creationdatetime unixvalue creationdate 18276 creationdatetime 1579146280000 2020-01-15 2020-01-15 03:44:40.000
Esempio: utilizzo di \t
o \n
come caratteri escape
Tieni in considerazione i seguenti dati di verifica:
" \\t\\t\\n 123 \\t\\t\\n ",abc " 456 ",xyz
La seguente istruzione crea una tabella in Athena, specificando "escapeChar" = "\\"
.
CREATE EXTERNAL TABLE test1 ( f1 string, s2 string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") LOCATION 's3://DOC-EXAMPLE-BUCKET/dataset/test1/'
Esegui quindi la seguente query:
SELECT * FROM test1;
Restituisce questo risultato, utilizzando correttamente \t
o \n
come caratteri di escape:
f1 s2 \t\t\n 123 \t\t\n abc 456 xyz
SerDe nome
Nome della libreria
Per utilizzarlo SerDe, specifica il nome completo della classe dopoROW FORMAT
SERDE
. Specificare anche i delimitatori all'interno di SERDEPROPERTIES
nel modo seguente:
... ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
Ignorare intestazioni
Per ignorare le intestazioni nei dati quando si definisce una tabella, è possibile utilizzare la proprietà skip.header.line.count
, come nell'esempio seguente.
TBLPROPERTIES ("skip.header.line.count"="1")
Per alcuni esempi, consulta le istruzioni CREATE TABLE
in Esecuzione di query sui log di flusso Amazon VPC e Interrogazione dei log di Amazon CloudFront .
Esempio
Questo esempio presuppone la presenza di dati in CSV salvati in s3://DOC-EXAMPLE-BUCKET/mycsv/
con il seguente contenuto:
"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"
Utilizza un'istruzione CREATE TABLE
per creare una tabella Athena basata sui dati. Fate riferimento alla classe OpenCSV SerDe ROW FORMAT SERDE
dopo e specificate il separatore di caratteri, il carattere di virgoletta e il carattere di escape in, come WITH
SERDEPROPERTIES
nell'esempio seguente.
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://DOC-EXAMPLE-BUCKET/mycsv/';
Crea una query di tutti i valori nella tabella:
SELECT * FROM myopencsvtable;
La query restituisce i seguenti valori:
col1 col2 col3 col4
-----------------------------
a1 a2 a3 a4
1 2 abc def
a a1 abc3 ab4