

# 从 JDBC 表并行读取
<a name="run-jdbc-parallel-read-job"></a>

您可以设置 JDBC 表的属性，以使 Amazon Glue 并行读取数据。当您设置某些属性时，您可以指示 Amazon Glue 对数据的逻辑分区运行并行 SQL 查询。您可以通过设置哈希字段或哈希表达式来控制分区。您还可以控制用于访问您的数据的并行读取的数量。

并行读取 JDBC 表是一种可以提高性能的优化技术。要详细了解确定何时适合使用这种技术的过程，请参阅《Amazon 规范性指南》中“优化 Amazon Glue for Apache Spark 作业性能的最佳实践”**指南中的 [减少数据扫描量](https://docs.amazonaws.cn/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/parallelize-tasks.html)。

要启用并行读取，可在表结构的参数字段中设置键值对。使用 JSON 表示法为表的参数字段设置值。有关编辑表属性的更多信息，请参阅 [查看和管理表详细信息](tables-described.md#console-tables-details)。当您调用 ETL（提取、转换和加载）方法 `create_dynamic_frame_from_options` 和 `create_dynamic_frame_from_catalog` 时，您也可以启用并行读取。有关在这些方法中指定选项的更多信息，请参阅 [from\$1options](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_options) 和 [from\$1catalog](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_catalog)。

您可以将此方法用于 JDBC 表，也即，其基本数据是 JDBC 数据存储的大多数表。当读取 Amazon Redshift 和 Amazon S3 表时，这些属性将被忽略。

**hashfield**  
将 `hashfield` 设置为 JDBC 表中要用来将数据划分成分区的列的名称。为了获得最佳效果，此列应具有值的偶数分布以便在各分区之间分布数据。此列可以是任意数据类型。Amazon Glue 生成非重叠的查询，这些查询并行运行以读取通过此列进行分区的数据。例如，如果您的数据按月份均匀地分布，您可以使用 `month` 列并行读取每月的数据。  

```
  'hashfield': 'month'
```
Amazon Glue 创建一个查询以便将字段值哈希处理成分区编号，并针对这些分区并行运行该查询。要使用您自己的查询对表读取进行分区，请提供 `hashexpression` 而不是 `hashfield`。

**hashexpression**  
将 `hashexpression` 设置为会返回一个整数的 SQL 表达式（符合 JDBC 数据库引擎语法）。简单表达式是表中任何数字列的名称。Amazon Glue 生成 SQL 查询以并行读取 JDBC 数据（通过使用 `WHERE` 子句中的 `hashexpression` 对数据分区）。  
例如，使用数字列 `customerID` 来读取按客户编号分区的数据。  

```
  'hashexpression': 'customerID'
```
要让 Amazon Glue 控制分区，请提供 `hashfield` 而不是 `hashexpression`。

**hashpartitions**  
将 `hashpartitions` 设置为 JDBC 表的并行读取数目。如果未设置该属性，默认值为 7。  
例如，将并行读取数目设置为 `5`，以便 Amazon Glue 通过五个（或更少）查询读取您的数据。  

```
  'hashpartitions': '5'
```