

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 Athena Spark 工作群組使用 Lake Formation
<a name="notebooks-spark-lakeformation"></a>

使用發行版本 Apache Spark 3.5 版，您可以使用 AWS Lake Formation AWS Glue Data Catalog，其中工作階段執行角色具有完整的資料表許可。此功能可讓您從 Athena Spark 互動式工作階段讀取和寫入受 Lake Formation 保護的資料表。請參閱下列各節，進一步了解 Lake Formation 以及如何搭配 Athena Spark 使用。

## 步驟 1：在 Lake Formation 中啟用完整資料表存取
<a name="notebooks-spark-lakeformation-enable-fta"></a>

若要使用完整資料表存取 (FTA) 模式，您必須允許 Athena Spark 在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation。若要啟用，請遵循[整合應用程式進行完整資料表存取](https://docs.aws.amazon.com//lake-formation/latest/dg/fta-app-integration.html)中的步驟。

### 步驟 1.1：使用使用者定義的角色在 Lake Formation 中註冊資料位置
<a name="notebooks-spark-lakeformation-register-locations"></a>

您必須使用使用者定義的角色來註冊其中的資料位置 AWS Lake Formation。如需詳細資訊[，請參閱用於註冊位置的角色需求](https://docs.aws.amazon.com//lake-formation/latest/dg/registration-role.html)。

## 步驟 2：設定工作階段執行角色的 IAM 許可
<a name="notebooks-spark-lakeformation-iam-permissions"></a>

對於基礎資料的讀取或寫入存取權，除了 Lake Formation 許可之外，執行角色還需要 `lakeformation:GetDataAccess` IAM 許可。有了此許可，Lake Formation 就會授與要求存取資料所需的臨時憑證。

以下範例政策說明如何提供 IAM 許可，以存取 Amazon S3 中的指令碼、將日誌上傳至 S3、 AWS Glue API 許可，以及存取 Lake Formation 的許可。

### 步驟 2.1：設定 Lake Formation 許可
<a name="notebooks-spark-lakeformation-configure-permissions"></a>
+ 從 S3 讀取資料的 Spark 任務需要 Lake Formation `SELECT`許可。
+ 在 S3 中寫入/刪除資料的 Spark 任務需要 Lake Formation `ALL (SUPER)`許可。
+ 與 AWS Glue 資料目錄互動的 Spark 任務需要 `DESCRIBE`、`ALTER`、 `DROP` 許可。

## 步驟 3：使用 Lake Formation 初始化完整資料表存取的 Spark 工作階段
<a name="notebooks-spark-lakeformation-initialize-session"></a>

### 先決條件
<a name="notebooks-spark-lakeformation-prerequisites"></a>

AWS Glue Data Catalog 必須設定為中繼存放區，才能存取 Lake Formation 資料表。

設定下列設定，將 AWS Glue 目錄設定為中繼存放區：

```
{
  "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"
}
```

若要存取向 註冊的資料表 AWS Lake Formation，需要在 Spark 初始化期間設定下列組態，以將 Spark 設定為使用 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"
}
```

### Amazon S3 Tables
<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"
}
```

## 考量事項與限制
<a name="notebooks-spark-lakeformation-considerations"></a>
+ Hive、Iceberg、Amazon S3 資料表和 Delta 資料表支援完整資料表存取。Hudi 資料表不支援完整資料表存取。
+ 若要將新目錄新增至作用中工作階段，請使用 `spark.conf.set`搭配新的目錄組態。
+ 目錄組態不可變。如果您想要更新目錄組態，請使用 建立新目錄`spark.conf.set`。
+ 僅將您需要的目錄新增至 Spark 工作階段。
+ 若要變更預設目錄： `spark.catalog.setCurrentCatalog("s3tablesbucket")`
+ 如果您的目錄名稱中有類似 的特殊字元`-`，請在查詢中逸出它，例如：

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