

# 注意事项和限制
<a name="querying-hudi-in-athena-considerations-and-limitations"></a>

使用 Athena 读取 Apache Hudi 表时，请考虑以下几点。
+ **读取和写入操作**：Athena 可以读取压缩的 Hudi 数据集，但不能写入 Hudi 数据。
+ **Hudi 版本**：Athena 支持 Hudi 版本 0.14.0（默认值）和 0.15.0。Athena 不保证与使用更高版本的 Hudi 创建的表具有读取兼容性。有关 Hudi 功能和版本控制的更多信息，请参阅 Apache 网站上的 [Hudi 文档](https://hudi.apache.org/)。请注意，Athena 上的 0.15.0 版 Hudi 连接器不支持引导启动表。要使用 Hudi 连接器 0.15.0，请设置以下表属性：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('athena_enable_native_hudi_connector_implementation' = 'true')
  ```
+ **跨账户查询**：Hudi 连接器 0.15.0 版不支持跨账户查询。
+ **查询类型**：目前，Athena 支持快照查询和读取优化查询，但不支持增量查询。在 MOR 表上，所有在读取优化查询中显示的 数据均已压缩。这提供了良好的性能，但不包括最新的增量提交。快照查询包含最新的数据，但会但产生一些计算开销，这使得这些查询的性能降低。有关在表和查询类型之间权衡的更多信息，请参阅 Apache Hudi 文档中的[表和查询类型](https://hudi.apache.org/docs/table_types/)。
+ **增量查询** – Athena 不支持增量查询。
+ **CTAS** – Athena 不支持对 Hudi 数据执行 [CTAS](ctas.md) 或者 [INSERT INTO](insert-into.md)。如果您希望 Athena 支持编写 Hudi 数据集，请将反馈发送至 athena-feedback@amazon.com。

  有关编写 Hudi 数据的更多信息，请参阅以下资源：
  + 《[Amazon EMR 版本指南](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/)》中的[使用 Hudi 数据集](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hudi-work-with-dataset.html)。
  + Apache Hudi 文档中的[写入数据](https://hudi.apache.org/docs/0.8.0/writing_data.html)。
+ **MSCK REPAIR TABLE** – 不支持在 Athena 的 Hudi 表上使用 MSCK REPAIR TABLE。如果您需要加载未在 AWS Glue 中创建的 Hudi 表，请使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ **不支持跳过 Amazon Glacier 对象** – 如果 Apache Hudi 表中的对象属于 Amazon Glacier 存储类别，将 `read_restored_glacier_objects` 表属性设置为 `false` 则无效。

  例如，假设发出以下命令：

  ```
  ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')
  ```

  对于 Iceberg 和 Delta Lake 表，该命令会生成错误 Unsupported table property key: read\$1restored\$1glacier\$1objects。对于 Hudi 表，`ALTER TABLE` 命令不会产生错误，但是仍无法跳过 Amazon Glacier 对象。在 `ALTER TABLE` 命令之后运行 `SELECT` 查询会继续返回所有对象。
+ **时间戳查询** – 当前，试图读取 Hudi 实时表中时间戳列的查询要么失败，要么产生空结果。此限制仅适用于读取时间戳列的查询。仅包含同一表中非时间戳列的查询会成功。

  失败的查询会返回类似于以下内容的消息：

  GENERIC\$1INTERNAL\$1ERROR: class org.apache.hadoop.io.ArrayWritable cannot be cast to class org.apache.hadoop.hive.serde2.io.TimestampWritableV2 (org.apache.hadoop.io.ArrayWritable and org.apache.hadoop.hive.serde2.io.TimestampWritableV2 are in unnamed module of loader io.trino.server.PluginClassLoader @75c67992)
+ **0.15.0 Hudi 连接器上的 Lake Formation 权限**：只有当您通过将表属性 `athena_enable_native_hudi_connector_implementation` 设置为 `true` 来选择使用原生 Hudi 连接器（版本 0.15.0）时，此限制才适用。默认情况下，Athena 使用 Hudi 连接器版本 0.14.0，其不需要此额外权限。要查询受 Lake Formation 保护的表，您必须授予 Lake Formation 对表的数据位置和 `.hoodie` 元数据目录的权限。例如，如果您的 Hudi 表位于 `s3://bucket/hudi-table/`，则必须在 Lake Formation 中注册并授予对 `s3://bucket/hudi-table/` 和 `s3://bucket/hudi-table/.hoodie/` 的权限。`.hoodie` 目录包含 Athena 在查询规划期间需要读取的元数据文件（例如 `hoodie.properties`）。如果没有访问 `.hoodie` 目录的权限，则查询将失败并出现权限被拒绝错误。