

# Acessar tabelas do Amazon S3 com o Catálogo de Tabelas do Amazon S3 para Apache Iceberg
<a name="s3-tables-client-catalog"></a>

É possível acessar tabelas do S3 por meio de mecanismos de consulta de código aberto, como o Apache Spark, usando o catálogo de cliente do Catálogo de Tabelas do Amazon S3 para Apache Iceberg. O Catálogo de Tabelas do Amazon S3 para Apache Iceberg é uma biblioteca de código aberto hospedada pelo AWS Labs. Ele traduz as operações do Apache Iceberg nos mecanismos de consulta (como descoberta de tabelas, atualizações de metadados e adição ou remoção de tabelas) em operações de API da funcionalidade Tabelas do S3.

O Catálogo de Tabelas do Amazon S3 para Apache Iceberg é distribuído como um Maven JAR chamado `s3-tables-catalog-for-iceberg.jar`. É possível criar o JAR do catálogo de cliente no [Repositório do AWS Labs GitHub](https://github.com/awslabs/s3-tables-catalog) ou baixá-lo no [Maven](https://mvnrepository.com/artifact/software.amazon.s3tables/s3-tables-catalog-for-iceberg). Ao se conectar às tabelas, o JAR do catálogo de cliente é usado como uma dependência quando você inicializa uma sessão do Spark para o Apache Iceberg.

## Usar o Catálogo de Tabelas do Amazon S3 para Apache Iceberg com o Apache Spark
<a name="s3-tables-integrating-open-source-spark"></a>

É possível usar o Catálogo de Tabelas do Amazon S3 para Apache Iceberg como catálogo de cliente para se conectar a tabelas de aplicações de código aberto ao inicializar uma sessão do Spark. Na configuração da sessão, você especifica dependências em relação ao Iceberg e ao Amazon S3, e cria um catálogo personalizado que usa o bucket de tabela como warehouse de metadados.

****Pré-requisitos****
+ Uma identidade do IAM com acesso ao bucket de tabela e a ações da funcionalidade Tabelas do S3. Para ter mais informações, consulte [Gerenciamento de acesso para a funcionalidade Tabelas do S3](s3-tables-setting-up.md).

**Como inicializar uma sessão do Spark usando o Catálogo de Tabelas do Amazon S3 para Apache Iceberg**
+ Inicialize o Spark usando o comando a seguir. Para usar o comando, substitua o *número de versão* do Catálogo de Tabelas do Amazon S3 para Apache Iceberg pela versão mais recente do [Repositório do AWS Labs GitHub](https://github.com/awslabs/s3-tables-catalog) e o *ARN do bucket de tabela* pelo ARN da sua própria tabela.

  ```
  spark-shell \
  --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1,software.amazon.s3tables:s3-tables-catalog-for-iceberg-runtime:0.1.4 \
  --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog \
  --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \
  --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
  ```

### Consultar tabelas do S3 com o Spark SQL
<a name="query-with-spark"></a>

Usando o Spark, você pode executar operações DQL, DML e DDL em tabelas do S3. Ao consultar tabelas, você usa o nome da tabela totalmente qualificado, bem como o nome do catálogo da sessão, seguindo este padrão:

`CatalogName.NamespaceName.TableName`

Os exemplos de consultas a seguir mostram algumas maneiras de interagir com as tabelas do S3. Para usar esses exemplos de consultas no mecanismo de consulta, substitua os valores dos *espaços reservados para entrada do usuário* pelos seus próprios.

**Como consultar tabelas com o Spark**
+ Crie um namespace 

  ```
  spark.sql(" CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_namespace")
  ```
+ Criar uma tabela

  ```
  spark.sql(" CREATE TABLE IF NOT EXISTS s3tablesbucket.my_namespace.`my_table` 
  ( id INT, name STRING, value INT ) USING iceberg ")
  ```
+ Consultar uma tabela

  ```
  spark.sql(" SELECT * FROM s3tablesbucket.my_namespace.`my_table` ").show()
  ```
+ Inserir dados em uma tabela

  ```
  spark.sql(
  """
      INSERT INTO s3tablesbucket.my_namespace.my_table 
      VALUES 
          (1, 'ABC', 100), 
          (2, 'XYZ', 200)
  """)
  ```
+ Carregue um arquivo de dados existente em uma tabela.

  1. Leia os dados no Spark.

     ```
     val data_file_location = "Path such as S3 URI to data file"
     val data_file = spark.read.parquet(data_file_location)
     ```

  1. Grave os dados em uma tabela do Iceberg.

     ```
     data_file.writeTo("s3tablesbucket.my_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()
     ```