

# 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
```