

# 将 AWS Glue for Spark 作业迁移到 AWS Glue 版本 4.0
<a name="migrating-version-40"></a>

本主题介绍 AWS Glue 版本 0.9、1.0、2.0 和 3.0 之间的变化，允许您将 Spark 应用程序和 ETL 任务迁移到 AWS Glue 4.0。还介绍了 AWS Glue 4.0 中的功能以及使用它的优点。

要将此功能与 AWS Glue ETL 任务结合使用，请在创建任务时为 `Glue version` 选择 **4.0**。

**Topics**
+ [支持的新功能](#migrating-version-40-features)
+ [用于迁移到 AWS Glue 4.0 的操作](#migrating-version-40-actions)
+ [迁移核对清单](#migrating-version-40-checklist)
+ [从 AWS Glue 3.0 迁移到 AWS Glue 4.0](#migrating-version-40-from-30)
+ [从 AWS Glue 2.0 迁移到 AWS Glue 4.0](#migrating-version-40-from-20)
+ [从 AWS Glue 1.0 迁移到 AWS Glue 4.0](#migrating-version-40-from-10)
+ [从 AWS Glue 0.9 迁移到 AWS Glue 4.0](#migrating-version-40-from-09)
+ [AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-40-connector-driver-migration)
+ [附录 A：显著依赖项升级](#migrating-version-40-appendix-dependencies)
+ [附录 B：JDBC 驱动程序升级](#migrating-version-40-appendix-jdbc-driver)
+ [附录 C：连接器升级](#migrating-version-40-appendix-connector)

## 支持的新功能
<a name="migrating-version-40-features"></a>

此部分介绍 AWS Glue 版本 4.0 的新功能和优势。
+ 它基于 Apache Spark 3.3.0，拥有对 AWS Glue 和 Amazon EMR 的优化，如自适应查询运行、矢量化读取器以及优化的随机排序和分区合并。
+ 升级了 JDBC 驱动程序，适用于所有 AWS Glue 原生源，包括 MySQL、Microsoft SQL Server、Oracle、PostgreSQL、MongoDB，并且升级了 Spark 3.3.0 引入的 Spark 库和依赖项。
+ 更新了新的 Amazon Redshift 连接器和 JDBC 驱动程序。
+ 使用升级的 EMR 文件系统（EMRFS）优化了 Amazon S3 访问，并且默认启用了 Amazon S3 优化的输出提交程序。
+ 使用分区索引、下推谓词、分区列表和升级的 Hive 元存储客户端优了化数据目录访问。
+ 通过单元级筛选条件和数据湖事务，与受监管目录表的 Lake Formation 集成。
+ 减少了启动延迟，改善了整体任务完成时间和交互性。
+ Spark 任务以 1 秒为增量计费，按 10 倍缩短最短计费持续时间（从最短 10 分钟到最短 1 分钟）。
+ 本机支持 Apache Hudi、Delta Lake 和 Apache Iceberg 的开放数据湖框架。
+ 本机支持基于 Amazon S3 的 Cloud Shuffle 存储插件（Apache Spark 插件），从而使用 Amazon S3 进行洗牌和弹性存储容量。

**从 Spark 3.1.1 到 Spark 3.3.0 的主要增强功能**  
请注意以下增强功能：
+ 行级运行时筛选（[SPARK-32268](https://issues.apache.org/jira/browse/SPARK-32268)）。
+ ANSI 增强功能（[SPARK-38860](https://issues.apache.org/jira/browse/SPARK-38860)）。
+ 错误消息改进（[SPARK-38781](https://issues.apache.org/jira/browse/SPARK-38781)）。
+ 支持 Parquet 矢量化阅读器（[SPARK-34863](https://issues.apache.org/jira/browse/SPARK-34863)）的复杂类型。
+ 支持 Spark SQL（[SPARK-37273](https://issues.apache.org/jira/browse/SPARK-37273)）的隐藏文件元数据。
+ 为 Python/Pandas UDF 提供分析器（[SPARK-37443](https://issues.apache.org/jira/browse/SPARK-37443)）。
+ 推出 Trigger.AvailableNow 来分批运行像 Trigger.Once 这样的流式查询（[SPARK-36533](https://issues.apache.org/jira/browse/SPARK-36533)）。
+ 更全面的 Datasource V2 下推功能（[SPARK-38788](https://issues.apache.org/jira/browse/SPARK-38788)）。
+ 从 log4j 1 迁移到 log4j 2（[SPARK-37814](https://issues.apache.org/jira/browse/SPARK-37814)）。

**其他显著的变化**  
注意以下更改：
+ 重大更改
  + 删除文档和 Python/Docs 中对 Python 3.6 支持的引用（[SPARK-36977](https://issues.apache.org/jira/browse/SPARK-36977)）。
  + 通过将内置 pickle 替换为 cloudpickle 来移除命名的元组黑客攻击（[SPARK-32079](https://issues.apache.org/jira/browse/SPARK-32079)）。
  + 将 pandas 的最低版本提高到 1.0.5（[SPARK-37465](https://issues.apache.org/jira/browse/SPARK-37465)）。

## 用于迁移到 AWS Glue 4.0 的操作
<a name="migrating-version-40-actions"></a>

对于现有任务，请将 `Glue version` 从以前的版本更改为任务配置中的 `Glue 4.0`。
+ 在 AWS Glue Studio 中，为 `Glue version` 选择 `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`。
+ 在 API 中，为 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-UpdateJob) API 操作中的 `GlueVersion` 参数选择 **4.0**。

对于新任务，请在创建任务时选择 `Glue 4.0`。
+ 在控制台中，为 `Glue version` 选择 `Spark 3.3, Python 3 (Glue Version 4.0) or Spark 3.3, Scala 2 (Glue Version 3.0)`。
+ 在 AWS Glue Studio 中，为 `Glue version` 选择 `Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3`。
+ 在 API 中，为 [https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 操作中的 `GlueVersion` 参数选择 **4.0**。

要查看从 AWS Glue 2.0 或更早版本到 AWS Glue 4.0 的 Spark 事件日志，请[使用 CloudFormation 或 Docker 为 AWS Glue 4.0 启动已升级的 Spark 历史服务器](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-history.html)。

## 迁移核对清单
<a name="migrating-version-40-checklist"></a>
+ 您的任务的外部 Python 库是否依赖于 Python 2.7/3.6？
  + 将依赖库从 Python 2.7/3.6 更新为 Python 3.10，因为 Spark 3.3.0 完全删除了 Python 2.7 和 3.6 支持。

## 从 AWS Glue 3.0 迁移到 AWS Glue 4.0
<a name="migrating-version-40-from-30"></a>

迁移时，请注意以下更改：
+ 所有现有任务参数和 AWS Glue 3.0 中存在的主要功能将存在于 AWS Glue 4.0。
+ AWS Glue 3.0 使用 Amazon EMR 优化的 Spark 3.1.1，AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。

  仅有几项 Spark 更改可能需要修订脚本，确保不会引用已删除的功能。
+ AWS Glue 4.0 还包括对 EMRFS 和 Hadoop 的更新。有关特定版本，请参阅[附录 A：显著依赖项升级](#migrating-version-40-appendix-dependencies)。
+ ETL 任务中提供的 AWS 开发工具包现已从 1.11 升级到 1.12。
+ 所有 Python 作业都将使用 Python 版本 3.10。以前，AWS Glue 3.0 中使用 Python 3.7。

  因此，AWS Glue 一些即用的 pymodule 得到了升级。
+ Log4j 已升级到 Log4j2。
  + 有关 Log4j2 迁移路径的信息，请参阅 [Log4j 文档](https://logging.apache.org/log4j/2.x/manual/migration.html#Log4j2API)。
  + 必须改为将任何自定义 log4j.properties 文件重命名为 log4j2.properties 文件，并使用相应的 log4j2 属性。
+ 有关迁移某些连接器的信息，请参阅[AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-40-connector-driver-migration)。
+ AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。请参阅 AWS Glue 作业迁移说明。

  您可以安全地将 AWS Glue 2.0/3.0 作业升级到 AWS Glue 4.0 作业，因为 AWS Glue 2.0/3.0 已经包含 AWS 加密 SDK 桥接版本。

请参阅 Spark 迁移文档：
+ [从 Spark SQL 3.1 升级到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [从 Spark SQL 3.2 升级到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)

## 从 AWS Glue 2.0 迁移到 AWS Glue 4.0
<a name="migrating-version-40-from-20"></a>

迁移时，请注意以下更改：

**注意**  
有关与 AWS Glue 3.0 相关的迁移步骤，请参阅[从 AWS Glue 3.0 迁移到 AWS Glue 4.0](#migrating-version-40-from-30)。
+ 所有现有任务参数和 AWS Glue 2.0 中存在的主要功能将存在于 AWS Glue 4.0。
+ 预设情况下，自 AWS Glue 3.0，将启用经 EMRFS S3 优化的提交程序，用于将 Parquet 数据写入 Amazon S3。但是，您仍然可以通过将 `--enable-s3-parquet-optimized-committer` 设置为 `false` 来禁用。
+ AWS Glue 2.0 使用开源 Spark 2.4，AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。
  + 仅有几项 Spark 更改可能需要修订脚本，确保不会引用已删除的功能。
  + 例如，Spark 3.3.0 不启用 Scala 无类型的 UDF，但 Spark 2.4 允许它们。
+ ETL 任务中提供的 AWS 开发工具包现已从 1.11 升级到 1.12。
+ AWS Glue 4.0 还更新了 EMRFS、JDBC 驱动程序，并且对 AWS Glue 提供的 Spark 进行了额外优化。
+ Scala 也从 2.11 更新到 2.12，Scala 2.12 不向后兼容 Scala 2.11。
+ Python 3.10 还是 Python 脚本使用的默认版本，因为 AWS Glue 2.0 仅使用了 Python 3.7和 2.7。
  + Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。
  + 自 AWS Glue 2.0 以来，提供了一种安装额外 Python 模块的新机制。
+ 多个依赖项更新，在 [附录 A：显著依赖项升级](#migrating-version-40-appendix-dependencies) 中突出显示。
+ 现有 AWS Glue 2.0 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项，因为 4.0 中的几个依赖项从 2.0 升级。您可以使用 `--user-jars-first` AWS Glue 作业参数，避免 AWS Glue 4.0 中的类路径冲突。
+ AWS Glue 4.0 使用 Spark 3.3。从 Spark 3.1 开始，从/到 parquet 文件加载/保存时间戳的行为发生了变化。有关更多详细信息，请参阅 [从 Spark SQL 3.0 升级到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)。

  在读取/写入包含时间戳列的 parquet 数据时，建议设置以下参数。设置这些参数可以解决 Spark 2 到 Spark 3 升级期间发生的 AWS Glue 动态帧和 Spark 数据帧的日历不兼容问题。使用 CORRECTED（更正）选项将按原样读取日期时间值；使用 LEGACY（旧式）选项将根据读取期间的日历差异重新设置日期时间值的基础。

  ```
  - Key: --conf
  - Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]
  ```
+ 有关迁移某些连接器的信息，请参阅[AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-40-connector-driver-migration)。
+ AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。请参阅以下有关 AWS Glue 工作迁移的说明：
  + 您可以安全地将 AWS Glue 2.0 作业升级到 AWS Glue 4.0 作业，因为 AWS Glue 2.0 已经包含 AWS 加密 SDK 桥接版本。

请参阅 Spark 迁移文档：
+ [从 Spark SQL 2.4 升级到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [从 Spark SQL 3.1 升级到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [从 Spark SQL 3.2 升级到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以来预期的日期时间行为更改。](https://issues.apache.org/jira/browse/SPARK-31408)

## 从 AWS Glue 1.0 迁移到 AWS Glue 4.0
<a name="migrating-version-40-from-10"></a>

迁移时，请注意以下更改：
+ AWS Glue 1.0 使用开源 Spark 2.4，AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。
  + 仅有几项 Spark 更改可能需要修订脚本，确保不会引用已删除的功能。
  + 例如，Spark 3.3.0 不启用 Scala 无类型的 UDF，但 Spark 2.4 允许它们。
+ AWS Glue 4.0 中的所有任务均会执行，显著缩短启动时间。Spark 任务以 1 秒为增量计费，按 10 倍缩短最短计费持续时间，因为启动延迟从最长 10 分钟到最长 1 分钟。
+ 在 AWS Glue 4.0 中，记录行为发生了显著变化，Spark 3.3.0 的最低要求为 Log4j2。
+ 多个依赖项更新，在附录中突出显示。
+ Scala 也从 2.11 更新到 2.12，Scala 2.12 不向后兼容 Scala 2.11。
+ Python 3.10 还是 Python 脚本使用的默认版本，因为 AWS Glue 0.9 仅使用了 Python 2。

  Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。
+ 从 AWS Glue 2.0 开始，提供通过 pip 安装额外 Python 模块的新机制。有关更多信息，请参阅[使用 pip 在 AWS Glue 2.0\$1 中安装其他 Python 模块](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html#addl-python-modules-support)。
+ AWS Glue 4.0 不会在 Apache YARN 上运行，因此 YARN 设置不适用。
+ AWS Glue 4.0 没有 Hadoop Distributed File System (HDFS)。
+ 现有 AWS Glue 1.0 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项，因为 4.0 中的几个依赖项从 1.0 升级。为了避免这个问题，我们默认使用 `--user-jars-first`AWS Glue 作业参数启用 AWS Glue 4.0。
+ AWS Glue 4.0 现在支持 Auto Scaling。因此，启用 Auto Scaling 后，ExecutorAllocationManager 指标将可用。
+ 在 AWS Glue 版本 4.0 任务中，您可以指定工件数量和工件类型，但不能指定 `maxCapacity`。
+ AWS Glue 4.0 尚不支持机器学习转换。
+ 有关迁移某些连接器的信息，请参阅 [AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-40-connector-driver-migration)。
+ AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。有关 AWS Glue 工作迁移的信息，请参阅这些说明。
  + 您无法将 AWS Glue 0.9/1.0 作业直接迁移到 AWS Glue 4.0 作业。这是因为当直接升级到 2.x 或更高版本并立即启用所有新功能时，AWS 加密开发工具包将无法解密在早期版本的 AWS 加密开发工具包下加密的加密文字。
  + 为了安全升级，我们首先建议您迁移到包含 AWS 加密开发工具包桥接版本的 AWS Glue 2.0/3.0 作业。运行一次作业即可使用 AWS 加密开发工具包桥接版本。
  + 完成后，您可以安全地将 AWS Glue 2.0/3.0 作业迁移到 AWS Glue 4.0。

请参阅 Spark 迁移文档：
+ [从 Spark SQL 2.4 升级到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [从 Spark SQL 3.0 升级到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [从 Spark SQL 3.1 升级到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [从 Spark SQL 3.2 升级到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以来预期的日期时间行为更改。](https://issues.apache.org/jira/browse/SPARK-31408)

## 从 AWS Glue 0.9 迁移到 AWS Glue 4.0
<a name="migrating-version-40-from-09"></a>

迁移时，请注意以下更改：
+ AWS Glue 0.9 使用开源 Spark 2.2.1，AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。
  + 仅有几项 Spark 更改可能需要修订脚本，确保不会引用已删除的功能。
  + 例如，Spark 3.3.0 不启用 Scala 无类型的 UDF，但 Spark 2.2 允许它们。
+ AWS Glue 4.0 中的所有任务均会执行，显著缩短启动时间。Spark 任务以 1 秒为增量计费，按 10 倍缩短最短计费持续时间，因为启动延迟从最长 10 分钟到最长 1 分钟。
+ 自 AWS Glue 4.0 以来，日志记录行为发生了重大变化，Spark 3.3.0 的最低要求为 Log4j2，如此处所述 (https://spark.apache.org/docs/latest/core-migration-guide.html\$1upgrading-from-core-32-to-33)。
+ 多个依赖项更新，在附录中突出显示。
+ Scala 也从 2.11 更新到 2.12，Scala 2.12 不向后兼容 Scala 2.11。
+ Python 3.10 还是 Python 脚本使用的默认版本，因为 AWS Glue 0.9 仅使用了 Python 2。
  + Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。
  + 提供一种通过 pip 安装额外 Python 模块的新机制。
+ AWS Glue 4.0 不会在 Apache YARN 上运行，因此 YARN 设置不适用。
+ AWS Glue 4.0 没有 Hadoop Distributed File System (HDFS)。
+ 现有 AWS Glue 0.9 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项，因为 3.0 中的几个依赖项从 0.9 升级。您可以使用 `--user-jars-first` AWS Glue 任务参数，避免 AWS Glue 3.0 中的类路径冲突。
+ AWS Glue 4.0 现在支持 Auto Scaling。因此，启用 Auto Scaling 后，ExecutorAllocationManager 指标将可用。
+ 在 AWS Glue 版本 4.0 任务中，您可以指定工件数量和工件类型，但不能指定 `maxCapacity`。
+ AWS Glue 4.0 尚不支持机器学习转换。
+ 有关迁移某些连接器的信息，请参阅 [AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-40-connector-driver-migration)。
+ AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。有关 AWS Glue 工作迁移的信息，请参阅这些说明。
  + 您无法将 AWS Glue 0.9/1.0 作业直接迁移到 AWS Glue 4.0 作业。这是因为当直接升级到 2.x 或更高版本并立即启用所有新功能时，AWS 加密开发工具包将无法解密在早期版本的 AWS 加密开发工具包下加密的加密文字。
  + 为了安全升级，我们首先建议您迁移到包含 AWS 加密开发工具包桥接版本的 AWS Glue 2.0/3.0 作业。运行一次作业即可使用 AWS 加密开发工具包桥接版本。
  + 完成后，您可以安全地将 AWS Glue 2.0/3.0 作业迁移到 AWS Glue 4.0。

请参阅 Spark 迁移文档：
+ [从 Spark SQL 2.2 升级到 2.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-22-to-23)
+ [从 Spark SQL 2.3 升级到 2.4](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24)
+ [从 Spark SQL 2.4 升级到 3.0](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-24-to-30)
+ [从 Spark SQL 3.0 升级到 3.1](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-30-to-31)
+ [从 Spark SQL 3.1 升级到 3.2](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-31-to-32)
+ [从 Spark SQL 3.2 升级到 3.3](https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-32-to-33)
+ [自 Spark 3.0 以来预期的日期时间行为更改。](https://issues.apache.org/jira/browse/SPARK-31408)

## AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移
<a name="migrating-version-40-connector-driver-migration"></a>

有关已升级的 JDBC 和数据湖连接器的版本，请参阅：
+ [附录 B：JDBC 驱动程序升级](#migrating-version-40-appendix-jdbc-driver)
+ [附录 C：连接器升级](#migrating-version-40-appendix-connector)

### Hudi
<a name="migrating-version-40-connector-driver-migration-hudi"></a>
+ Spark SQL 支持方面的改进：
  + 通过 `Call Procedure` 命令，增加了对升级、降级、引导、清理和修复的支持。可以在 Spark SQL 中使用 `Create/Drop/Show/Refresh Index` 语法。
  + 与 Spark SQL 相比，通过 Spark DataSource 使用之间的性能差距已经缩小。过去，数据源写入速度比 SQL 快。
  + 所有内置密钥生成器都实现了更高性能的 Spark 特定 API 操作。
  + 将批量 `insert` 操作中的 UDF 转换替换为 RDD 转换，以降低使用 SerDe 的成本。
  + 带有 Hudi 的 Spark SQL 要求 `primaryKey` 在 SQL 语句中由 `tblproperites` 或选项指定。对于更新和删除操作，`preCombineField` 也是必需的。
+ 从 0.10.0 版本开始创建的任何没有 `primaryKey` 的 Hudi 表都需要使用自版本 0.10.0 起的 `primaryKey` 字段重新创建。

### PostgreSQL
<a name="migrating-version-40-connector-driver-migration-postgresql"></a>
+ 多个漏洞（CVE）已得到解决。
+ 本机支持 Java 8。
+ 如果任务是使用数组的数组，则除字节数组外，可以将此场景视为多维数组。

### MongoDB
<a name="migrating-version-40-connector-driver-migration-mongodb"></a>
+ 当前的 MongoDB 连接器支持 Spark 3.1 或更高版本以及 MongoDB 版本 4.0 或更高版本。
+ 由于连接器升级，一些属性名称发生了变化。例如，URI 属性名更改为 `connection.uri`。有关当前选项的更多信息，请参阅 [MongoDB Spark 连接器博客](https://www.mongodb.com/docs/spark-connector/current/configuration/)。
+ 使用 Amazon DocumentDB 托管的 MongoDB 4.0 有一些功能差异。有关更多信息，请参阅以下主题：
  + [功能差异：Amazon DocumentDB 和 MongoDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html)
  +  [支持的 MongoDB API、操作和数据类型](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)。
+ “partitioner”（分区程序）选项仅限于 `ShardedPartitioner`、`PaginateIntoPartitionsPartitioner`、和 `SinglePartitionPartitioner`。它不能为 Amazon DocumentDB 使用默认 `SamplePartitioner` 和 `PaginateBySizePartitioner`，因为阶段运算符不支持 MongoDB API。有关更多信息，请参阅[支持的 MongoDB API、操作和数据类型](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)。

### Delta Lake
<a name="migrating-version-40-connector-driver-migration-delta"></a>
+ Delta Lake 现在支持[在 SQL 中进行时空旅行](https://docs.delta.io/2.1.0/delta-batch.html#query-an-older-snapshot-of-a-table-time-travel)，以便轻松查询较旧的数据。在此更新中，时空旅行现在既可以在 Spark SQL 中使用，也可以通过 DataFrame API 使用。已在 SQL 中添加了对当前版本的 TIMESTAMP 的支持。
+ Spark 3.3 推出了用于运行流式查询的 [Trigger.AvailableNow](https://issues.apache.org/jira/browse/SPARK-36533)，等同于 `Trigger.Once` 批量查询。在使用 Delta 表作为流媒体源时，此支持也可用。
+ 支持 SHOW COLUMNS 返回表中的列表。
+ 在 Scala 和 Python DeltaTable API 中支持 [DESCRIBE DETAIL](https://docs.delta.io/2.1.0/delta-utility.html#retrieve-delta-table-details)。它使用 DeltaTable API 或 Spark SQL 检索有关 Delta 表的详细信息。
+ 支持从 SQL [删除](https://github.com/delta-io/delta/pull/1328)、[合并](https://github.com/delta-io/delta/pull/1327)和[更新](https://github.com/delta-io/delta/pull/1331)命令返回操作指标。以前这些 SQL 命令返回一个空的 DataFrame，现在它们返回一个 DataFrame，其中包含有关所执行操作的有用指标。
+ 优化性能改进：
  + 将配置选项 `spark.databricks.delta.optimize.repartition.enabled=true` 设置为在“优化”命令使用 `repartition(1)` 而不是 `coalesce(1)`，以提高压缩许多小文件时的性能。
  + 通过使用基于队列的方法对压缩作业进行并行化来[提高性能](https://github.com/delta-io/delta/pull/1315)。
+ 其他显著的变化：
  + [支持在 VACUUM 和 OPTIMIZE SQL 命令中使用变量](https://github.com/delta-io/delta/issues/1267)。
  + 对带有目录表的 CONVERT TO DELTA 的改进包括：
    + 如果未提供分区架构，则[自动填充目录中的分区架构](https://github.com/delta-io/delta/commit/18d4d12ed06f973006501f6c39c8785db51e2b1f)。
    + [使用目录中的分区信息](https://github.com/delta-io/delta/commit/ebff29904f3ababb889897343f8f8f7a010a1f71)来查找要提交的数据文件，而不是进行完整的目录扫描。不是提交表目录中的所有数据文件，而是只提交活动分区目录下的数据文件。
  + 当未使用 DROP COLUMN 和 RENAME COLUMN 时，[支持对启用列映射的表进行更改数据馈送 (CDF) 批量读取](https://github.com/delta-io/delta/issues/1349)。有关更多信息，请参阅 [Delta Lake 文档](https://docs.delta.io/2.1.0/delta-change-data-feed.html#known-limitations)。
  + 通过在第一阶段启用架构修剪来[提高更新命令的性能](https://github.com/delta-io/delta/pull/1202)。

### Apache Iceberg
<a name="migrating-version-40-connector-driver-migration-iceberg"></a>
+ 为扫描计划和 Spark 查询添加了多项[性能改进](https://iceberg.apache.org/releases/#performance-improvements)。
+ 添加了一个通用 REST 目录客户端，该客户端使用基于更改的提交来解决服务端的提交冲突。
+ 支持 SQL 时空旅行查询的 `AS OF` 语法。
+ 为 MERGE 和 UPDATE 查询添加了读取时合并支持。
+ 添加了对使用 Z 顺序重写分区的支持。
+ 为 Puffin 添加了规范和实施，这是一种用于大型统计数据和索引 blob 的格式，例如 [Theta sketch](https://datasketches.apache.org/docs/Theta/InverseEstimate.html) 或布隆过滤器。
+ 添加了用于增量使用数据的新接口（追加和更改日志扫描）。
+ 增加了对 FileIO 接口的批量操作和远程读取的支持。
+ 增加了更多元数据表，以显示元数据树中的删除文件。
+ 删除表的行为发生了变化。在 Iceberg 0.13.1 中，运行 `DROP TABLE` 会将表从目录中移除，同时删除表内容。在 Iceberg 1.0.0 中，`DROP TABLE` 仅将表从目录中删除。要删除表格内容，请使用 `DROP TABLE PURGE`。
+ 在 Iceberg 1.0.0 中，Park 矢量化读取默认启用。如果要禁用矢量化读取，请设置 `read.parquet.vectorization.enabled` 为 `false`。

### Oracle
<a name="migrating-version-40-connector-driver-migration-oracle"></a>

更改很小。

### MySQL
<a name="migrating-version-40-connector-driver-migration-mysql"></a>

更改很小。

### Amazon Redshift
<a name="migrating-version-40-connector-driver-migration-redshift"></a>

AWS Glue 4.0 采用了新的 Amazon Redshift 连接器和新的 JDBC 驱动程序。有关增强功能以及如何从先前 AWS Glue 版本迁移的信息，请参阅[Redshift 连接](aws-glue-programming-etl-connect-redshift-home.md)。

## 附录 A：显著依赖项升级
<a name="migrating-version-40-appendix-dependencies"></a>

以下是依赖项升级：


| 依赖关系 | AWS Glue 4.0 中的版本 | AWS Glue 3.0 中的版本 | AWS Glue 2.0 中的版本 | AWS Glue 1.0 中的版本 | 
| --- | --- | --- | --- | --- | 
| Spark | 3.3.0-amzn-1 | 3.1.1-amzn-0 | 2.4.3 | 2.4.3 | 
| Hadoop | 3.3.3-amzn-0 | 3.2.1-amzn-3 | 2.8.5-amzn-5 | 2.8.5-amzn-1 | 
| Scala | 2.12 | 2.12 | 2.1.1 | 2.1.1 | 
| Jackson | 2.13.3 | 2.10.x | 2.7.x | 2.7.x | 
| Hive | 2.3.9-amzn-2 | 2.3.7-amzn-4 | 1.2 | 1.2 | 
| EMRFS | 2.54.0 | 2.46.0 | 2.38.0 | 2.30.0 | 
| Json4s | 3.7.0-M11 | 3.6.6 | 3.5.x | 3.5.x | 
| Arrow | 7.0.0 | 2.0.0 | 0.10.0 | 0.10.0 | 
| AWS Glue 数据目录客户端 | 3.7.0 | 3.0.0 | 1.10.0 | 不适用 | 
| Python | 3.10 | 3.7 | 2.7 和 3.6 | 2.7 和 3.6 | 
| Boto | 1.26 | 1.18 | 1.12 | 不适用 | 

## 附录 B：JDBC 驱动程序升级
<a name="migrating-version-40-appendix-jdbc-driver"></a>

以下是 JDBC 驱动程序升级：


| 驱动程序 | 过去 AWS Glue 版本中的 JDBC 驱动程序版本 | AWS Glue 3.0 中的 JDBC 驱动程序版本 | AWS Glue 4.0 中的 JDBC 驱动程序版本 | 
| --- | --- | --- | --- | 
| MySQL | 5.1 | 8.0.23 | 8.0.23 | 
| Microsoft SQL Server | 6.1.0 | 7.0.0 | 9.4.0 | 
| Oracle 数据库 | 11.2 | 21.1 | 21.7 | 
| PostgreSQL | 42.1.0 | 42.2.18 | 42.3.6 | 
| MongoDB | 2.0.0 | 4.0.0 | 4.7.2 | 
| Amazon Redshift |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc41-1.2.12.1017   |  redshift-jdbc42-2.1.0.16  | 

## 附录 C：连接器升级
<a name="migrating-version-40-appendix-connector"></a>

以下是连接器升级：


| 驱动程序 | AWS Glue 3.0 中的连接器版本 | AWS Glue 4.0 中的连接器版本 | 
| --- | --- | --- | 
| MongoDB | 3.0.0 | 10.0.4 | 
| Hudi | 0.10.1 | 0.12.1 | 
| Delta Lake | 1.0.0 | 2.1.0 | 
| Iceberg | 0.13.1 | 1.0.0 | 
| DynamoDB | 1.11 | 1.12 | 