

# Particionamento para entidades não de ODP
<a name="sap-odata-non-odp-entities-partitioning"></a>

No Apache Spark, particionamento se refere ao modo como os dados são divididos e distribuídos entre os nós de trabalho de um cluster para processamento paralelo. Cada partição é um bloco lógico de dados que pode ser processado de modo independente por uma tarefa. Particionamento é um conceito fundamental no Spark que afeta diretamente a performance, a escalabilidade e a utilização de recursos. Os trabalhos do AWS Glue usam o mecanismo de particionamento do Spark para dividir o conjunto de dados em partes menores (partições) que podem ser processadas paralelamente nos nós de trabalho do cluster. Observe que o particionamento não é aplicável a entidades de ODP.

Para obter mais detalhes, consulte [AWS Glue Spark and PySpark jobs](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html).

**Pré-requisitos**

Um objeto OData do SAP que você deseja ler. Você precisará do nome do objeto/EntitySet. Por exemplo: ` /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder `.

**Exemplo**

```
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)
```

## Particionamento de consultas
<a name="sap-odata-partitioning-queries"></a>

### Particionamento baseado no campo
<a name="sap-odata-field-based-partitioning"></a>

É possível fornecer as opções adicionais do Spark `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` e `NUM_PARTITIONS` se quiser utilizar a simultaneidade no Spark. Com esses parâmetros, a consulta original seria dividida em `NUM_PARTITIONS` subconsultas, que poderiam ser executadas pelas tarefas do Spark simultaneamente. Os campos Integer, Date e DateTime oferecem suporte ao particionamento com base em campo no conector do SAP OData.
+ `PARTITION_FIELD`: o nome do campo a ser usado para particionar a consulta.
+ `LOWER_BOUND`: um valor limite inferior inclusivo do campo de partição escolhido.

   Em qualquer campo com dados do tipo DataTime, o formato de timestamp do Spark usado nas consultas em SQL do Spark é aceito.

  Exemplos de valores válidos: `"2000-01-01T00:00:00.000Z"` 
+ `UPPER_BOUND`: um valor limite superior exclusivo do campo de partição escolhido.
+ `NUM_PARTITIONS`: número de partições.
+ `PARTITION_BY`: o tipo de particionamento a ser realizado, `FIELD` a ser passado no caso de particionamento baseado em campo.

**Exemplo**

```
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)
```

### Particionamento baseado em registro
<a name="sap-odata-record-based-partitioning"></a>

A consulta original seria dividida em `NUM_PARTITIONS` subconsultas, que poderiam ser executadas pelas tarefas do Spark simultaneamente.

O particionamento com base em registros só é compatível para entidades não ODP, pois a paginação em entidades ODP é compatível por meio do próximo token/ignorar token.
+ `PARTITION_BY`: o tipo de particionamento a ser executado. `COUNT` deve ser passado no caso de particionamento baseado em registro.

**Exemplo**

```
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)
```