

# Bibliotecas SerDe CSV
<a name="serde-csv-choices"></a>

Ao criar uma tabela para dados CSV no Athena, é possível usar a biblioteca Open CSV SerDe ou a biblioteca Lazy Simple SerDe. Para ajudar você a decidir qual usar, considere as diretrizes a seguir.
+ Se os seus valores nos dados estiverem entre aspas duplas (`"`), será possível usar a biblioteca [Open CSV SerDe](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde) para desserializar os valores no Athena. Se os valores nos dados não estiverem entre aspas duplas (`"`), você poderá omiti-los especificando qualquer SerDe. Nesse caso, o Athena usa o Lazy Simple SerDe padrão. Para ter mais informações, consulte [Lazy Simple SerDe para arquivos CSV, TSV e com delimitação personalizada](lazy-simple-serde.md).
+  Se os dados tiverem valores UNIX numéricos de `TIMESTAMP` (por exemplo, `1579059880000`), use o Open CSV SerDe. Se os dados usarem o formato `java.sql.Timestamp`, use o Lazy Simple SerDe.

**Topics**
+ [Lazy Simple SerDe para arquivos CSV, TSV e com delimitação personalizada](lazy-simple-serde.md)
+ [Open CSV SerDe para processamento de CSV](csv-serde.md)

# Lazy Simple SerDe para arquivos CSV, TSV e com delimitação personalizada
<a name="lazy-simple-serde"></a>

Como esse é o SerDe padrão no Athena para dados em formatos CSV, TSV e com delimitação personalizada, especificá-lo é opcional. Em sua instrução `CREATE TABLE`, se você não especificar um SerDe e especificar somente `ROW FORMAT DELIMITED`, o Athena usará esse SerDe. Use esse SerDe caso os dados não tenham valores entre aspas.

Para documentação de referência sobre o Lazy Simple SerDe, consulte a seção [Hive SerDe](https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HiveSerDe) do Guia do desenvolvedor do Apache Hive.

## Nome da biblioteca de serialização
<a name="lazy-simple-serde-library-name"></a>

O nome da biblioteca de serialização do Lazy Simple SerDe é `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe`. Para obter informações sobre o código-fonte, consulte [LazySimpleSerDe.java](https://github.com/apache/hive/blob/master/serde/src/java/org/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe.java) em GitHub.com. 

## Ignorar cabeçalhos
<a name="lazy-simple-serde-ignoring-headers"></a>

Para ignorar os cabeçalhos nos dados ao definir a tabela, você pode usar a propriedade de tabela `skip.header.line.count`, conforme mostrado no exemplo a seguir.

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

Para obter exemplos que ignoram cabeçalhos, consulte as instruções `CREATE TABLE` em [Consultar os logs de fluxo do Amazon VPC](vpc-flow-logs.md) e [Consultar logs do Amazon CloudFront](cloudfront-logs.md).

## Exemplo de CSV
<a name="csv-example"></a>

O exemplo a seguir mostra como usar a biblioteca `LazySimpleSerDe` para criar uma tabela no Athena com base em dados CSV. Para desserializar arquivos com delimitação personalizada usando esse SerDe, siga o padrão no exemplo, mas use a cláusula `FIELDS TERMINATED BY` para especificar um delimitador de caractere único diferente. O Lazy Simple SerDe não oferece suporte a delimitadores de vários caracteres.

**nota**  
Substitua *myregion* em `s3://athena-examples-myregion/path/to/data/` pelo identificador da região onde o Athena é executado, por exemplo, `s3://athena-examples-us-west-1/path/to/data/`.

Use a instrução `CREATE TABLE` para criar uma tabela do Athena usando os dados subjacentes em CSV armazenados no Amazon S3.

```
CREATE EXTERNAL TABLE flight_delays_csv (
    yr INT,
    quarter INT,
    month INT,
    dayofmonth INT,
    dayofweek INT,
    flightdate STRING,
    uniquecarrier STRING,
    airlineid INT,
    carrier STRING,
    tailnum STRING,
    flightnum STRING,
    originairportid INT,
    originairportseqid INT,
    origincitymarketid INT,
    origin STRING,
    origincityname STRING,
    originstate STRING,
    originstatefips STRING,
    originstatename STRING,
    originwac INT,
    destairportid INT,
    destairportseqid INT,
    destcitymarketid INT,
    dest STRING,
    destcityname STRING,
    deststate STRING,
    deststatefips STRING,
    deststatename STRING,
    destwac INT,
    crsdeptime STRING,
    deptime STRING,
    depdelay INT,
    depdelayminutes INT,
    depdel15 INT,
    departuredelaygroups INT,
    deptimeblk STRING,
    taxiout INT,
    wheelsoff STRING,
    wheelson STRING,
    taxiin INT,
    crsarrtime INT,
    arrtime STRING,
    arrdelay INT,
    arrdelayminutes INT,
    arrdel15 INT,
    arrivaldelaygroups INT,
    arrtimeblk STRING,
    cancelled INT,
    cancellationcode STRING,
    diverted INT,
    crselapsedtime INT,
    actualelapsedtime INT,
    airtime INT,
    flights INT,
    distance INT,
    distancegroup INT,
    carrierdelay INT,
    weatherdelay INT,
    nasdelay INT,
    securitydelay INT,
    lateaircraftdelay INT,
    firstdeptime STRING,
    totaladdgtime INT,
    longestaddgtime INT,
    divairportlandings INT,
    divreacheddest INT,
    divactualelapsedtime INT,
    divarrdelay INT,
    divdistance INT,
    div1airport STRING,
    div1airportid INT,
    div1airportseqid INT,
    div1wheelson STRING,
    div1totalgtime INT,
    div1longestgtime INT,
    div1wheelsoff STRING,
    div1tailnum STRING,
    div2airport STRING,
    div2airportid INT,
    div2airportseqid INT,
    div2wheelson STRING,
    div2totalgtime INT,
    div2longestgtime INT,
    div2wheelsoff STRING,
    div2tailnum STRING,
    div3airport STRING,
    div3airportid INT,
    div3airportseqid INT,
    div3wheelson STRING,
    div3totalgtime INT,
    div3longestgtime INT,
    div3wheelsoff STRING,
    div3tailnum STRING,
    div4airport STRING,
    div4airportid INT,
    div4airportseqid INT,
    div4wheelson STRING,
    div4totalgtime INT,
    div4longestgtime INT,
    div4wheelsoff STRING,
    div4tailnum STRING,
    div5airport STRING,
    div5airportid INT,
    div5airportseqid INT,
    div5wheelson STRING,
    div5totalgtime INT,
    div5longestgtime INT,
    div5wheelsoff STRING,
    div5tailnum STRING
)
    PARTITIONED BY (year STRING)
    ROW FORMAT DELIMITED
      FIELDS TERMINATED BY ','
      ESCAPED BY '\\'
      LINES TERMINATED BY '\n'
    LOCATION 's3://athena-examples-myregion/flight/csv/';
```

Execute a `MSCK REPAIR TABLE` para atualizar metadados da partição sempre que uma nova partição for adicionada a essa tabela:

```
MSCK REPAIR TABLE flight_delays_csv;
```

Consulte as 10 rotas principais atrasadas há mais de 1 hora:

```
SELECT origin, dest, count(*) as delays
FROM flight_delays_csv
WHERE depdelayminutes > 60
GROUP BY origin, dest
ORDER BY 3 DESC
LIMIT 10;
```

**nota**  
Os dados da tabela de voos foram extraídos dos [Voos](http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time) fornecidos pelo Departamento de Transportes dos EUA, [Bureau of Transportation Statistics](http://www.transtats.bts.gov/) (Agência de Estatísticas de Transportes). Saturação do original removida.

## Exemplo de TSV
<a name="tsv-example"></a>

Para criar uma tabela do Athena com base em dados TSV armazenados no Amazon S3, use `ROW FORMAT DELIMITED` e especifique `\t` como delimitador do campo de tabulação, `\n` como separador de linhas e `\` como o caractere de escape. O trecho a seguir mostra essa sintaxe. Nenhum exemplo de dados de voo do TSV está disponível no local de `athena-examples`, mas, como na tabela CSV, você executaria `MSCK REPAIR TABLE` para atualizar os metadados da partição sempre que uma nova partição fosse adicionada. 

```
...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
...
```

# Open CSV SerDe para processamento de CSV
<a name="csv-serde"></a>

Use a biblioteca Open CSV SerDe para criar tabelas no Athena a partir de dados separados por vírgula (CSV).

## Nome da biblioteca de serialização
<a name="csv-serde-library-name"></a>

O nome da biblioteca de serialização do Open CSV SerDe é `org.apache.hadoop.hive.serde2.OpenCSVSerde`. Para obter informações sobre o código-fonte, consulte [CSV SerDe](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde) na documentação do Apache.

## Usar Open CSV SerDe
<a name="csv-serde-using"></a>

Para usar esse SerDe, especifique o nome totalmente qualificado da classe após `ROW FORMAT SERDE`. Especifique também os delimitadores dentro de `SERDEPROPERTIES`, como no exemplo a seguir.

```
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar"     = "`",
  "escapeChar"    = "\\"
)
```

### Ignorar cabeçalhos
<a name="csv-serde-opencsvserde-ignoring-headers"></a>

Para ignorar os cabeçalhos nos dados ao definir a tabela, você pode usar a propriedade de tabela `skip.header.line.count`, conforme mostrado no exemplo a seguir.

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

Para ver exemplos, consulte as instruções `CREATE TABLE` em [Consultar os logs de fluxo do Amazon VPC](vpc-flow-logs.md) e [Consultar logs do Amazon CloudFront](cloudfront-logs.md).

### Usar NULL para dados inválidos
<a name="csv-serde-opencsvserde-using-null"></a>

Para usar valores NULL para dados cuja desserialização para o tipo definido da coluna falha, é possível usar a propriedade de tabela `use.null.for.invalid.data`, como mostrado no exemplo a seguir. 

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

**Importante**  
Definir `use.null.for.invalid.data` como `TRUE` pode gerar resultados incorretos ou inesperados, pois os valores `NULL` substituem os dados inválidos nas colunas que não correspondem ao esquema. Recomendamos que você corrija os dados nos arquivos ou no esquema da tabela em vez de habilitar essa propriedade. Quando essa propriedade está habilitada, não ocorrem falhas nas consultas devido a dados inválidos, o que pode impedir que você detecte problemas de qualidade de dados.

### Considerações sobre dados de strings
<a name="csv-serde-opencsvserde-considerations-string"></a>

O Open CSV SerDe apresenta as seguintes características de dados de strings:
+ Usa aspas duplas (`"`) como o caractere de aspas padrão e permite que você especifique separadores, aspas e caracteres de escape, como: 

  ```
  WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
  ```
+ Não é possível inserir um caractere de escape em `\t` ou `\n` diretamente. Para inserir um caractere de escape neles, use `"escapeChar" = "\\"`. Para ver um exemplo, consulte [Example: Escaping \t or \n](#csv-serde-opencsvserde-example-escaping-t-or-n).
+ O Open CSV SerDe não oferece suporte a quebras de linha incorporadas em arquivos CSV.

### Considerações sobre dados não strings
<a name="csv-serde-opencsvserde-considerations-non-string"></a>

Para tipos de dados diferentes de `STRING`, o Open CSV SerDe apresenta o comportamento a seguir:
+ Reconhece os tipos de dados `BOOLEAN`, `BIGINT`, `INT` e `DOUBLE`. 
+ Não reconhece valores vazios ou nulos nas colunas definidas como um tipo de dados numérico, deixando-os como `string`. Uma solução alternativa é criar a coluna com os valores nulos como `string` e usar `CAST` para converter o campo de uma consulta em um tipo de dados numérico, especificando um valor padrão de `0` para nulos. Para obter mais informações, consulte [Quando consulto dados CSV no Athena, aparece o erro HIVE\$1BAD\$1DATA: erro ao analisar valor do campo](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-error-csv/) (em inglês) na Central de Conhecimento da AWS.
+ Para colunas especificadas com o tipo de dados `timestamp` na instrução `CREATE TABLE`, reconhece os dados de `TIMESTAMP` caso sejam especificados no formato numérico UNIX em milissegundos, como `1579059880000`. Para ver um exemplo, consulte [Example: Using the TIMESTAMP type and DATE type specified in the UNIX numeric format](#csv-serde-opencsvserde-example-timestamp-unix).
  + O Open CSV SerDe não oferece suporte a `TIMESTAMP` no formato `java.sql.Timestamp` compatível com JDBC, como `"YYYY-MM-DD HH:MM:SS.fffffffff"` (precisão de 9 casas decimais).
+ Para colunas especificadas com o tipo de dados `DATE` na instrução `CREATE TABLE`, reconhece os valores como datas se os valores representam o número de dias decorridos desde 1º de janeiro de 1970. Por exemplo, o valor `18276` em uma coluna com o tipo de dados `date` é processado como `2020-01-15` quando consultado. Nesse formato UNIX, é considerado que cada dia tenha 86.400 segundos.
  + O Open CSV SerDe não oferece suporte a `DATE` em nenhum outro formato diretamente. Para processar os dados de carimbo de data/hora em outros formatos, você pode definir a coluna como `string` e usar as funções de conversão de tempo para retornar os resultados desejados em sua consulta `SELECT`. Para obter mais informações, consulte o artigo [When I query a table in Amazon Athena, the TIMESTAMP result is empty](https://aws.amazon.com/premiumsupport/knowledge-center/query-table-athena-timestamp-empty/) (Quando consulto uma tabela no Amazon Athena, o resultado de TIMESTAMP está vazio) na [Central de Conhecimento da AWS](https://aws.amazon.com/premiumsupport/knowledge-center/).
+ Para converter mais colunas para o tipo desejado em uma tabela, [crie uma visualização](views.md) sobre a tabela e use `CAST` para converter para o tipo desejado.

## Exemplos
<a name="csv-serde-opencsvserde-examples"></a>

**Example Exemplo: consulta de dados CSV simples**  
O exemplo a seguir pressupõe que você tenha dados CSV salvos no local `s3://amzn-s3-demo-bucket/mycsv/` com o conteúdo a seguir:  

```
"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"
```
Use uma instrução `CREATE TABLE` para criar uma tabela do Athena com base nos dados. Faça referência a `OpenCSVSerde` (observe o “d” minúsculo) após `ROW FORMAT SERDE` e especifique o separador de caractere, o caractere de aspas e o caractere de escape em `WITH SERDEPROPERTIES`, como no exemplo a seguir.  

```
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/';
```
Consulte todos os valores na tabela:  

```
SELECT * FROM myopencsvtable;
```
A consulta retorna os valores a seguir:  

```
col1     col2    col3    col4
-----------------------------
a1       a2      a3      a4
1        2       abc     def
a        a1      abc3    ab4
```

**Example Exemplo: uso do tipo TIMESTAMP e do tipo DATE especificados no formato numérico UNIX**  
Considere as três colunas de dados separados por vírgula a seguir. Os valores em cada coluna são colocados entre aspas duplas.  

```
"unixvalue creationdate 18276 creationdatetime 1579059880000","18276","1579059880000"
```
A instrução a seguir cria uma tabela no Athena com base no local do bucket do Amazon S3 especificado.  

```
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'
```
Em seguida, execute a consulta a seguir:   

```
SELECT * FROM testtimestamp1
```
A consulta retorna o seguinte resultado, exibindo os dados de data e hora:  

```
profile_id                                                        creationdate     creationdatetime
unixvalue creationdate 18276 creationdatetime 1579146280000       2020-01-15       2020-01-15 03:44:40.000
```

**Example Exemplo: como inserir caracteres de escape \$1t ou \$1n**  
Considere os seguintes dados de teste:  

```
" \\t\\t\\n 123 \\t\\t\\n ",abc
" 456 ",xyz
```
A instrução a seguir cria uma tabela no Athena que especifica `"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/'
```
Em seguida, execute a consulta a seguir:   

```
SELECT * FROM test1;
```
Ele retorna esse resultado, inserindo corretamente caracteres de escape em `\t` ou `\n`:  

```
f1            s2
\t\t\n 123 \t\t\n            abc
456                          xyz
```