

# 在 Athena for Spark 中使用非 Hive 表格式
<a name="notebooks-spark-table-formats"></a>

**注意**  
本页指的是在 Pyspark 引擎 3 发行版中使用 Python 库。有关支持的开放表格式版本，请参阅 [Amazon EMR 7.12](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-7120-release.html)。

在 Athena for Spark 中使用会话和笔记本时，除了 Apache Hive 表之外，还可以使用 Linux Foundation Delta Lake、Apache Hudi 和 Apache Iceberg 表。

## 注意事项和限制
<a name="notebooks-spark-table-formats-considerations-and-limitations"></a>

在 Athena for Spark 中使用除 Apache Hive 以外的表格式时，请考虑以下几点：
+ 除了 Apache Hive 之外，每个笔记本仅支持一种表格式。要在 Athena for Spark 中使用多种表格式，为每种表格式创建一个单独的笔记本。有关在 Athena for Spark 中创建笔记本的信息，请参阅 [步骤 7：创建自己的笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook)。
+ Delta Lake、Hudi 和 Iceberg 表格式已在 Athena for Spark 上使用 AWS Glue 作为元存储进行了测试。也可以使用其他元存储，但目前不支持这种用法。
+ 要使用其他表格式，按照 Athena 控制台和本文档中的说明覆盖默认 `spark_catalog` 属性。这些非 Hive 目录除了可以读取其自己的表格式，还可以读取 Hive 表。

## 表格版本
<a name="notebooks-spark-table-formats-versions"></a>

下表显示了 Amazon Athena for Apache Spark 中支持的非 Hive 表版本。


****  

| 表格式 | 支持的版本 | 
| --- | --- | 
| Apache Iceberg | 1.2.1 | 
| Apache Hudi | 0.13 | 
| Linux Foundation Delta Lake | 2.0.2 | 

在 Athena for Spark 中，这些表格式 `.jar` 文件及其依赖项将加载到 Spark 驱动程序和执行程序的类路径中。

有关展示如何在 Amazon Athena 笔记本中使用 Spark SQL 处理 Iceberg、Hudi 和 Delta Lake 表格式 *AWS 大数据博客*文章，请参阅 [Use Amazon Athena with Spark SQL for your open-source transactional table formats](https://aws.amazon.com/blogs/big-data/use-amazon-athena-with-spark-sql-for-your-open-source-transactional-table-formats/)。

**Topics**
+ [注意事项和限制](#notebooks-spark-table-formats-considerations-and-limitations)
+ [表格版本](#notebooks-spark-table-formats-versions)
+ [Iceberg](notebooks-spark-table-formats-apache-iceberg.md)
+ [Hudi](notebooks-spark-table-formats-apache-hudi.md)
+ [Delta Lake](notebooks-spark-table-formats-linux-foundation-delta-lake.md)

# 在 Athena for Spark 中使用 Apache Iceberg 表
<a name="notebooks-spark-table-formats-apache-iceberg"></a>

[Apache Iceberg](https://iceberg.apache.org/) 是 Amazon Simple Storage Service（Amazon S3）中适用于大型数据集的开放表格式。它提供快速的大型表查询性能、原子提交、并发写入和 SQL 兼容表演进等功能。

要在 Athena for Spark 中使用 Apache Iceberg 表，配置以下 Spark 属性。当选择 Apache Iceberg 作为表格式时，这些属性是在 Athena for Spark 控制台中默认配置的属性。有关步骤，请参阅 [步骤 4：编辑会话详细信息](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 和 [步骤 7：创建自己的笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook)。

```
"spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog",
"spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.sql.catalog.spark_catalog.io-impl": "org.apache.iceberg.aws.s3.S3FileIO",
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
```

以下过程演示了如何在 Athena for Spark 笔记本中使用 Apache Iceberg 表。在笔记本的新单元格中运行每个步骤。

**在 Athena for Spark 中使用 Apache Iceberg 表**

1. 定义要在笔记本中使用的常量。

   ```
   DB_NAME = "NEW_DB_NAME"
   TABLE_NAME = "NEW_TABLE_NAME"
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. 创建 Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)。

   ```
   columns = ["language","users_count"]
   data = [("Golang", 3000)]
   df = spark.createDataFrame(data, columns)
   ```

1. 创建数据库。

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 创建空白 Apache Iceberg 表。

   ```
   spark.sql("""
   CREATE TABLE {}.{} (
   language string,
   users_count int
   ) USING ICEBERG
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 在表中插入一行数据。

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME, TABLE_NAME))
   ```

1. 确认您可以查询新表。

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```

有关使用 Spark DataFrames 和 Iceberg 表的更多信息和示例，请参阅 Apache Iceberg 文档中的 [Spark 查询](https://iceberg.apache.org/docs/latest/spark-queries/)。

# 在 Athena for Spark 中使用 Apache Hudi 表
<a name="notebooks-spark-table-formats-apache-hudi"></a>

[https://hudi.apache.org/](https://hudi.apache.org/)是一个开源数据管理框架，可简化增量递增数据的处理。记录级别插入、更新、更新插入和删除操作的处理精度提高，从而减少开销。

要在 Athena for Spark 中使用 Apache Hudi 表，配置以下 Spark 属性。当选择 Apache Hudi 作为表格式时，这些属性是在 Athena for Spark 控制台中默认配置的属性。有关步骤，请参阅 [步骤 4：编辑会话详细信息](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 和 [步骤 7：创建自己的笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook)。

```
"spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog",
"spark.serializer": "org.apache.spark.serializer.KryoSerializer",
"spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension"
```

以下过程向你展示了如何在 Athena for Spark 笔记本中使用 Apache Hudi 表。在笔记本的新单元格中运行每个步骤。

**在 Athena for Spark 中使用 Apache Hudi 表**

1. 定义要在笔记本中使用的常量。

   ```
   DB_NAME = "NEW_DB_NAME"
   TABLE_NAME = "NEW_TABLE_NAME"
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. 创建 Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)。

   ```
   columns = ["language","users_count"]
   data = [("Golang", 3000)]
   df = spark.createDataFrame(data, columns)
   ```

1. 创建数据库。

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 创建空白 Apache Hudi 表。

   ```
   spark.sql("""
   CREATE TABLE {}.{} (
   language string,
   users_count int
   ) USING HUDI
   TBLPROPERTIES (
   primaryKey = 'language',
   type = 'mor'
   );
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 在表中插入一行数据。

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME,TABLE_NAME))
   ```

1. 确认您可以查询新表。

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```

# 在 Athena for Spark 中使用 Linux Foundation Delta Lake 表
<a name="notebooks-spark-table-formats-linux-foundation-delta-lake"></a>

[Linux Foundation Delta Lake](https://delta.io/) 是一种用于大数据分析的表格式。可使用 Athena for Spark 直接读取存储在 Amazon S3 中的 Delta Lake 表。

要在 Athena for Spark 中使用 Delta Lake 表，配置以下 Spark 属性。当选择 Delta Lake 作为表格式时，这些属性是在 Athena for Spark 控制台中默认配置的属性。有关步骤，请参阅 [步骤 4：编辑会话详细信息](notebooks-spark-getting-started.md#notebooks-spark-getting-started-editing-session-details) 和 [步骤 7：创建自己的笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook)。

```
"spark.sql.catalog.spark_catalog" : "org.apache.spark.sql.delta.catalog.DeltaCatalog", 
"spark.sql.extensions" : "io.delta.sql.DeltaSparkSessionExtension"
```

以下过程演示了如何在 Athena for Spark 笔记本中使用 Delta Lake 表。在笔记本的新单元格中运行每个步骤。

**在 Athena for Spark 中使用 Delta Lake 表**

1. 定义要在笔记本中使用的常量。

   ```
   DB_NAME = "NEW_DB_NAME" 
   TABLE_NAME = "NEW_TABLE_NAME" 
   TABLE_S3_LOCATION = "s3://amzn-s3-demo-bucket"
   ```

1. 创建 Apache Spark [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)。

   ```
   columns = ["language","users_count"] 
   data = [("Golang", 3000)] 
   df = spark.createDataFrame(data, columns)
   ```

1. 创建数据库。

   ```
   spark.sql("CREATE DATABASE {} LOCATION '{}'".format(DB_NAME, TABLE_S3_LOCATION))
   ```

1. 创建空白 Delta Lake 表。

   ```
   spark.sql("""
   CREATE TABLE {}.{} ( 
     language string, 
     users_count int 
   ) USING DELTA 
   """.format(DB_NAME, TABLE_NAME))
   ```

1. 在表中插入一行数据。

   ```
   spark.sql("""INSERT INTO {}.{} VALUES ('Golang', 3000)""".format(DB_NAME, TABLE_NAME))
   ```

1. 确认您可以查询新表。

   ```
   spark.sql("SELECT * FROM {}.{}".format(DB_NAME, TABLE_NAME)).show()
   ```