

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usar o S3 Select com Spark para melhorar a performance das consultas
<a name="emr-spark-s3select"></a>

**Importante**  
O Amazon S3 Select não está mais disponível para novos clientes. Os clientes existentes do Amazon S3 Select podem continuar usando o recurso normalmente. [Saiba mais](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Com as versões 5.17.0 e posteriores do Amazon EMR, você pode usar o [S3 Select](https://aws.amazon.com/blogs/aws/s3-glacier-select/) com Spark no Amazon EMR. O *S3 Select* possibilita que as aplicações recuperem apenas um subconjunto dos dados de um objeto. Para o Amazon EMR, o trabalho computacional de filtrar grandes conjuntos de dados para processamento é enviado do cluster para o Amazon S3, o que pode melhorar a performance em algumas aplicações e reduz o volume de dados transferidos entre o Amazon EMR e o Amazon S3.

O S3 Select é compatível com arquivos CSV e JSON usando os valores `s3selectCSV` e `s3selectJSON` para especificar o formato de dados. Para ter mais informações e exemplos, consulte [Especificar o S3 Select no seu código](#emr-spark-s3select-specify).

## O S3 Select é adequado para minha aplicação?
<a name="emr-spark-s3select-apps"></a>

Recomendamos que você avalie seus aplicativos com e sem o S3 Selecione para ver se o uso pode ser adequado para o aplicativo.

Use as seguintes diretrizes para determinar se o seu aplicativo é adequado para o uso do S3 Select:
+ Sua consulta filtra mais de metade do conjunto de dados original.
+ Sua conexão de rede entre o Amazon S3 e o cluster do Amazon EMR tem boa velocidade de transferência e largura de banda disponível. O Amazon S3 não compacta respostas HTTP. Portanto, é provável que o tamanho da resposta aumente para arquivos de entrada compactados.

## Considerações e limitações
<a name="emr-spark-s3select-considerations"></a>
+ A criptografia do lado do servidor do Amazon S3 com chaves de criptografia fornecidas pelo cliente (SSE-C) e a criptografia do lado do cliente não são suportadas. 
+ A propriedade `AllowQuotedRecordDelimiters` não é compatível. Se essa propriedade for especificada, a consulta falhará.
+ Somente arquivos CSV e JSON em UTF-8 formato são suportados. Multi-line CSVs não são compatíveis.
+ Somente arquivos descompactados ou gzip são compatíveis.
+ As opções CSV e JSON do Spark, como `nanValue`, `positiveInf`, `negativeInf` e opções relacionadas a registros corrompidos (por exemplo, modo dropmalformed e failfast) não são compatíveis.
+ O uso de vírgulas (,) em casas decimais não é compatível. Por exemplo, `10,000` não é compatível, mas `10000` é.
+ Caracteres de comentário na última linha não são compatíveis.
+ Linhas vazias no final de um arquivo não são processadas.
+ Os seguintes filtros não são enviados para o Amazon S3:
  + Funções agregadas, como `COUNT()` e `SUM()`.
  + Filtros que `CAST()` um atributo. Por exemplo, .`CAST(stringColumn as INT) = 1`
  + Filtros com um atributo que é um objeto ou complexo. Por exemplo, .`intArray[1] = 1, objectColumn.objectNumber = 1`
  + Filtros para os quais o valor não é um valor literal. Por exemplo, `intColumn1 = intColumn2`.
  + Somente [tipos de dados compatíveis com o S3 Select](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-data-types.html) são compatíveis com as limitações documentadas.

## Especificar o S3 Select no seu código
<a name="emr-spark-s3select-specify"></a>

Os exemplos a seguir demonstram como especificar o S3 Select para CSV usando Scala, SQL, R e. PySpark Você pode usar o S3 Select para JSON da mesma forma. Para obter uma lista de opções, os valores padrão e limitações, consulte [Opções](#emr-spark-s3select-specify-options).

------
#### [ PySpark ]

```
spark
  .read
  .format("{{s3selectCSV}}") // "s3selectJson" for Json
  .schema(...) // optional, but recommended
  .options(...) // optional
  .load("{{s3://path/to/my/datafiles}}")
```

------
#### [ R ]

```
read.df("{{s3://path/to/my/datafiles}}", "{{s3selectCSV}}", schema, header = "true", delimiter = "\t")
```

------
#### [ Scala ]

```
spark
  .read
  .format("{{s3selectCSV}}") // "s3selectJson" for Json
  .schema(...) // optional, but recommended
  .options(...) // optional. Examples:  
  // .options(Map("quote" -> "\'", "header" -> "true")) or
  // .option("quote", "\'").option("header", "true")
  .load("{{s3://path/to/my/datafiles}}")
```

------
#### [ SQL ]

```
CREATE TEMPORARY VIEW {{MyView}} (number INT, name STRING) USING {{s3selectCSV}} OPTIONS (path "{{s3://path/to/my/datafiles}}", header "true", delimiter "\t")
```

------

### Opções
<a name="emr-spark-s3select-specify-options"></a>

As seguintes opções estão disponíveis ao usar `s3selectCSV` e `s3selectJSON`. Se não for especificado, os valores padrão serão usados.

#### Opções com o S3selectCSV
<a name="emr-spark-s3select-specify-options-csv"></a>


| Opção | Padrão | Usage | 
| --- | --- | --- | 
| `compression` | `"none"` | Indica se a compactação é usada. `"gzip"` é a única configuração compatível além de `"none"`. | 
| `delimiter` | "," | Especifica o delimitador de campo. | 
| `quote` | `'\"'` | Especifica o caractere de aspas. Não há suporte para a especificação de uma string vazia e isso resulta em um erro de XML malformado. | 
| `escape` | `'\\'` | Especifica o caractere de escape. | 
| `header` | `"false"` | `"false"` especifica que não há cabeçalho. `"true"` especifica que o cabeçalho está na primeira linha. Somente cabeçalhos na primeira linha são suportados e linhas vazias antes de um cabeçalho não são compatíveis. | 
| comment | `"#"` | Especifica o caractere de comentário. O indicador de comentários não pode ser desativado. Em outras palavras, um valor de `\u0000` não é suportado. | 
| `nullValue` | "" |  | 

#### Opções com S3selectJSON
<a name="emr-spark-s3select-specify-options-json"></a>


| Opção | Padrão | Usage | 
| --- | --- | --- | 
| `compression` | `"none"` | Indica se a compactação é usada. `"gzip"` é a única configuração compatível além de `"none"`. | 
| `multiline` | "falso" | `"false"` especifica que o JSON está no formato `LINES` do S3 Select, o que significa que cada linha nos dados de entrada contém um único objeto JSON. `"true"` especifica que o JSON está no formato `DOCUMENT` do S3 Select, o que significa que um objeto JSON podem abranger várias linhas nos dados de entrada. | 