

# 非 ODP 实体的分区


在 Apache Spark 中，分区是指在集群中的 Worker 节点之间划分和分配数据以实现并行处理的方式。每个分区都是一个逻辑数据块，可以通过任务独立处理。分区是 Spark 中的一个基本概念，它直接影响性能、可扩展性和资源利用率。Amazon Glue 作业使用 Spark 的分区机制将数据集划分为较小的块（分区），从而可以在集群的 Worker 节点上并行处理。请注意，分区不适用于 ODP 实体。

有关更多详细信息，请参阅 [Amazon Glue Spark 和 PySpark 作业](https://docs.amazonaws.cn/glue/latest/dg/spark_and_pyspark.html)。

**先决条件**

您要从中读取内容的 SAP OData 对象。您将需要对象/实体集名称。例如：` /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder `。

**示例**

```
sapodata_read = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder"
    }, transformation_ctx=key)
```

## 对查询进行分区


### 基于字段的分区


如果您想在 Spark 中利用并发，可以提供其他 Spark 选项：`PARTITION_FIELD`、`LOWER_BOUND`、`UPPER_BOUND` 和 `NUM_PARTITIONS`。使用这些参数，原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。整数、日期和日期时间字段支持 SAP OData 连接器中基于字段的分区。
+ `PARTITION_FIELD`：用于对查询进行分区的字段的名称。
+ `LOWER_BOUND`：所选分区字段的包含下限值。

   对于任何数据类型为 DateTime 的字段，接受 Spark SQL 查询中使用的 Spark 时间戳格式。

  有效值示例：`"2000-01-01T00:00:00.000Z"`
+ `UPPER_BOUND`：所选分区字段的排除上限值。
+ `NUM_PARTITIONS`：分区的数量。
+ `PARTITION_BY`：要执行的类型分区；如果是基于字段的分区，则传递 `FIELD`。

**示例**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "PARTITION_FIELD": "validStartDate"
        "LOWER_BOUND": "2000-01-01T00:00:00.000Z"
        "UPPER_BOUND": "2020-01-01T00:00:00.000Z"
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "FIELD"
    }, transformation_ctx=key)
```

### 基于记录的分区


原始查询将被拆分为 `NUM_PARTITIONS` 个子查询，这些子查询可以由 Spark 任务同时执行。

只有非 ODP 实体支持基于记录的分区，因为 ODP 实体中的分页通过下一个令牌/跳过令牌支持。
+ `PARTITION_BY`：要执行的类型分区。如果是基于记录的分区，则传递 `COUNT`。

**示例**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "COUNT"
    }, transformation_ctx=key)
```

# 限制/标注

+ 由于分页使用跳过令牌/增量令牌处理，ODP 实体与基于记录的分区不兼容。因此，对于基于记录的分区，无论用户输入什么，maxConcurrency 的默认值都设置为“null”。
+ 当同时应用限制和分区时，限制优先于分区。