

# Uso do Lake Formation com grupos de trabalho do Athena Spark
<a name="notebooks-spark-lakeformation"></a>

Com a versão de lançamento do Apache Spark versão 3.5, você pode aproveitar o AWS Lake Formation com o Catálogo de Dados do AWS Glue, em que o perfil de execução da sessão tem permissões completas da tabela. Esse recurso permite que você leia e grave em tabelas protegidas pelo Lake Formation nas sessões interativas do Athena Spark. Consulte as seções a seguir para saber mais sobre o Lake Formation e como usá-lo com o Athena Spark.

## Etapa 1: habilitar o acesso total à tabela no Lake Formation
<a name="notebooks-spark-lakeformation-enable-fta"></a>

Para usar o modo de acesso total à tabela (FTA), você precisa permitir que o Athena Spark acesse dados sem a validação das tags de sessão do IAM no AWS Lake Formation. Para habilitar, siga as etapas em [Application integration for full table access](https://docs.aws.amazon.com//lake-formation/latest/dg/fta-app-integration.html).

### Etapa 1.1: registrar os locais de dados no Lake Formation usando o perfil definido pelo usuário
<a name="notebooks-spark-lakeformation-register-locations"></a>

Você deve usar um perfil definido pelo usuário para registrar locais de dados no AWS Lake Formation. Consulte [Requisitos para perfis usados para registrar locais](https://docs.aws.amazon.com//lake-formation/latest/dg/registration-role.html) para obter detalhes.

## Etapa 2: configurar as permissões do IAM para o perfil de execução da sessão
<a name="notebooks-spark-lakeformation-iam-permissions"></a>

Para acesso de leitura ou gravação aos dados subjacentes, além das permissões do Lake Formation, o perfil de execução precisa da permissão `lakeformation:GetDataAccess` do IAM. Com essa permissão, o Lake Formation concede a solicitação de credenciais temporárias para acessar os dados.

Confira a seguir um exemplo de política de como fornecer permissões do IAM para acesso a um script no Amazon S3, upload de logs no S3, permissões da API do AWS Glue e permissão para acessar o Lake Formation.

### Etapa 2.1: configurar as permissões do Lake Formation
<a name="notebooks-spark-lakeformation-configure-permissions"></a>
+ Os trabalhos do Spark que leem dados do S3 precisam da permissão `SELECT` do Lake Formation.
+ Os trabalhos do Spark que gravam/excluem dados no S3 precisam da permissão `ALL (SUPER)` do Lake Formation.
+ Os trabalhos do Spark que interagem com o Catálogo de Dados do AWS Glue precisam das permissões `DESCRIBE`, `ALTER` e `DROP`, conforme apropriado.

## Etapa 3: inicializar uma sessão do Spark para acesso total à tabela usando o Lake Formation
<a name="notebooks-spark-lakeformation-initialize-session"></a>

### Pré-requisitos
<a name="notebooks-spark-lakeformation-prerequisites"></a>

O Catálogo de Dados do AWS Glue deve ser configurado como um metastore para acessar as tabelas do Lake Formation.

Defina as seguintes configurações para configurar o catálogo do AWS Glue como um metastore:

```
{
  "spark.hadoop.glue.catalogid": "ACCOUNT_ID",
  "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
  "spark.hadoop.hive.metastore.glue.catalogid": "ACCOUNT_ID",
  "spark.sql.catalogImplementation": "hive"
}
```

Para acessar as tabelas registradas no AWS Lake Formation, é necessário definir as seguintes configurações durante a inicialização do Spark a fim de configurá-lo para usar credenciais do AWS Lake Formation.

### Hive
<a name="notebooks-spark-lakeformation-hive-config"></a>

```
{
  "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver",
  "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true",
  "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true",
  "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true",
  "spark.sql.catalog.createDirectoryAfterTable.enabled": "true",
  "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true"
}
```

### Apache Iceberg
<a name="notebooks-spark-lakeformation-iceberg-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog",
  "spark.sql.catalog.spark_catalog.warehouse": "s3://your-bucket/warehouse/",
  "spark.sql.catalog.spark_catalog.client.region": "REGION",
  "spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID",
  "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true"
}
```

### Tabelas do Amazon S3
<a name="notebooks-spark-lakeformation-s3tables-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.{catalogName}": "org.apache.iceberg.spark.SparkCatalog",
  "spark.sql.catalog.{catalogName}.warehouse": "arn:aws:s3tables:{region}:{accountId}:bucket/{bucketName}",
  "spark.sql.catalog.{catalogName}.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.{catalogName}.glue.id": "{accountId}:s3tablescatalog/{bucketName}",
  "spark.sql.catalog.{catalogName}.glue.lakeformation-enabled": "true",
  "spark.sql.catalog.{catalogName}.client.region": "REGION",
  "spark.sql.catalog.{catalogName}.glue.account-id": "ACCOUNT_ID"
}
```

### Delta Lake
<a name="notebooks-spark-lakeformation-deltalake-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog",
  "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver",
  "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": "true",
  "spark.hadoop.fs.s3.folderObject.autoAction.disabled": "true",
  "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": "true",
  "spark.sql.catalog.createDirectoryAfterTable.enabled": "true",
  "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true"
}
```

## Condições e limitações
<a name="notebooks-spark-lakeformation-considerations"></a>
+ O acesso total à tabela é compatível com as Tabelas do Amazon S3, Hive, Iceberg e Delta. As tabelas Hudi não oferecem suporte acesso total à tabela.
+ Para adicionar novos catálogos a uma sessão ativa, use `spark.conf.set` com novas configurações de catálogo.
+ As configurações do catálogo são imutáveis. Se você quiser atualizar uma configuração de catálogo, crie um novo catálogo usando `spark.conf.set`.
+ Adicione somente os catálogos necessários à sessão do Spark.
+ Para alterar o catálogo padrão: `spark.catalog.setCurrentCatalog("s3tablesbucket")`
+ Se você tiver caracteres especiais no nome do seu catálogo, como `-`, escape-os em sua consulta desta forma:

  ```
  SELECT sales_amount as nums FROM `my-s3-tables-bucket`.`s3namespace`.`daily_sales` LIMIT 100
  ```