

# Conexión a SAP OData
<a name="connecting-to-data-sap-odata"></a>

SAP OData es un protocolo web estándar que se utiliza para consultar y actualizar los datos presentes en SAP mediante ABAP (programación avanzada de aplicaciones empresariales), que aplica y aprovecha tecnologías web como HTTP para proporcionar acceso a la información desde una variedad de aplicaciones, plataformas y dispositivos externos. Con el producto, puede acceder a todo lo que necesita para integrarse sin problemas con su sistema, aplicación o datos de SAP.

**Topics**
+ [Compatibilidad de AWS Glue con SAP OData](sap-odata-support.md)
+ [Creación de conexiones de](sap-odata-creating-connections.md)
+ [Creación de un trabajo de SAP OData](sap-odata-creating-job.md)
+ [Escribir en SAP OData](sap-odata-writing.md)
+ [Uso del script de administración de estado de SAP OData](sap-odata-state-management-script.md)
+ [Particiones para entidades que no sean ODP](sap-odata-non-odp-entities-partitioning.md)
+ [Opciones de conexión de SAP OData](sap-odata-connection-options.md)
+ [Detalles de la entidad y del campo de SAP OData](sap-odata-entity-field-details.md)

# Compatibilidad de AWS Glue con SAP OData
<a name="sap-odata-support"></a>

AWS Glue es compatible con SAP OData de la siguiente manera:

**¿Es compatible como origen?**  
Sí. Puede usar los trabajos de ETL de AWS Glue para consultar datos de SAP OData.

**¿Es compatible como destino?**  
Sí. Puede usar los trabajos de ETL de AWS Glue para escribir registros en SAP OData.

**Versiones de la API de SAP OData compatibles**  
Las siguientes versiones de la API de SAP OData son compatibles:
+ 2.0

**Orígenes compatibles**  
Se admiten los siguientes orígenes:
+ Orígenes de ODP (Aprovisionamiento de datos operativos):
  + Extractores BW (DataSources)
  + Vistas CDS
  + SLT
+ Orígenes que no sean ODP, por ejemplo:
  + Servicios de vistas CDS
  + Servicios basados en RFC
  + Servicios ABAP personalizados

**Componentes SAP admitidos**  
Los requisitos mínimos son los siguientes:
+ Debe habilitar el servicio de catálogo para la detección de servicios.
  + Configure los orígenes de datos de aprovisionamiento de datos operativos (ODP) para la extracción en el SAP Gateway de su sistema SAP.
  + **OData V2.0**: puede habilitar los servicios de catálogo de OData V2.0 en SAP Gateway mediante la transacción `/IWFND/MAINT_SERVICE`.
  + Habilite los servicios OData V2.0 en su SAP Gateway mediante la transacción `/IWFND/MAINT_SERVICE`.
  + El servicio SAP OData debe admitir opciones de paginación o consulta del lado del cliente, como `$top` y `$skip`. También debe admitir la opción de consulta del sistema `$count`.
  + Debe proporcionar la autorización requerida para que el usuario de SAP descubra los servicios y extraiga datos mediante los servicios OData de SAP. Consulte la documentación de seguridad proporcionada por SAP.
+ Si desea utilizar OAuth 2.0 como mecanismo de autorización, debe habilitar OAuth 2.0 para el servicio OData y registrar el cliente OAuth según la documentación de SAP.
+ Para generar un servicio OData basado en orígenes de datos ODP, SAP Gateway Foundation debe instalarse localmente en su pila de ERP/BW o en una configuración de hub.
  + Para sus aplicaciones de ERP/BW, la pila SAP NetWeaver AS ABAP debe ser de la versión 7.50 SP02 o superior.
  + Para el sistema hub (SAP Gateway), el SAP NetWeaver AS ABAP del sistema hub debe ser de la versión 7.50 SP01 o superior para la configuración de hub remoto.
+ Para orígenes que no sean ODP, la versión de la pila de SAP NetWeaver debe ser 7.40 SP02 o posterior.

**Métodos de autenticación compatibles**  
Se admiten los siguientes métodos de autenticación:
+ Autenticación básica
+ OAuth 2.0

# Requisitos previos
<a name="sap-odata-prerequisites"></a>

Antes de iniciar un trabajo AWS Glue de extracción de datos de SAP OData mediante la conexión de SAP OData, complete los siguientes requisitos previos:
+ El servicio OData de SAP correspondiente debe estar activado en el sistema SAP para garantizar que el origen de datos esté disponible para su consumo. Si el servicio OData no está activado, el trabajo de Glue no podrá acceder a los datos de SAP ni extraerlos.
+ Los mecanismos de autenticación apropiados, como la autenticación básica (personalizada) u OAuth 2.0, deben configurarse en SAP para garantizar que el trabajo AWS Glue pueda establecer una conexión con el servicio OData de SAP correctamente.
+ Configure las políticas de IAM para conceder los permisos adecuados al trabajo AWS Glue para acceder a SAP, Secrets Manager y otros recursos de AWS involucrados en el proceso.
+ Si el sistema SAP está alojado en una red privada, la conectividad de la VPC debe configurarse para garantizar que el trabajo AWS Glue pueda comunicarse de forma segura con SAP sin exponer datos confidenciales a través de la Internet pública.

AWS Secrets Manager se puede utilizar para almacenar información confidencial de forma segura, como las credenciales de SAP, que el trabajo AWS Glue puede recuperar de forma dinámica en el tiempo de ejecución. Este enfoque elimina la necesidad de una codificación rígida de las credenciales, lo que mejora la seguridad y la flexibilidad.

Los siguientes requisitos previos proporcionan una guía paso a paso sobre cómo configurar cada componente para una integración fluida entre AWS Glue y SAP OData.

**Topics**
+ [Activación de SAP OData](sap-odata-activation.md)
+ [Políticas de IAM](sap-odata-configuring-iam-permissions.md)
+ [Conectividad/Conexión de VPC](sap-odata-connectivity-vpc-connection.md)
+ [Autenticación SAP](sap-odata-authentication.md)
+ [AWS Secrets Manager para almacenar su secreto de autenticación](sap-odata-aws-secret-manager-auth-secret.md)

# Activación de SAP OData
<a name="sap-odata-activation"></a>

Siga los pasos que se describen a continuación para realizar la conexión SAP OData:

## Orígenes de ODP
<a name="sap-odata-odp-sources"></a>

Antes de poder transferir desde un proveedor ODP, deberá cumplir los siguientes requisitos:
+ Tiene una instancia de SAP NetWeaver AS ABAP.
+ Su instancia de SAP NetWeaver contiene un proveedor ODP del que desea transferir datos. Los proveedores ODP incluyen:
  + SAP DataSources (código de transacción RSO2)
  + Vistas de SAP Core Data Services ABAP CDS
  + Sistemas SAP BW o SAP BW/4HANA (InfoObject, DataStore Object)
  + Replicación en tiempo real de tablas y vistas de bases de datos desde SAP Source System mediante SAP Landscape Replication Server (SAP SLT)
  + Vistas de información de SAP HANA en orígenes basados en SAP ABAP
+ Su instancia de SAP NetWeaver tiene el componente SAP Gateway Foundation.
+ Ha creado un servicio OData que extrae datos de su proveedor ODP. Para crear el servicio OData, utilice SAP Gateway Service Builder. Para acceder a los datos de ODP, Amazon AppFlow llama a este servicio mediante la API de OData. Para obtener más información, consulte [Generación de un servicio para extraer datos de ODP mediante OData](https://help.sap.com/docs/SAP_BPC_VERSION_BW4HANA/dd104a87ab9249968e6279e61378ff66/69b481859ef34bab9cc7d449e6fff7b6.html?version=11.0) en la documentación de SAP BW/4HANA.
+ Para generar un servicio OData basado en orígenes de datos ODP, SAP Gateway Foundation debe instalarse localmente en su pila de ERP/BW o en una configuración de hub.
  + Para sus aplicaciones de ERP/BW, la pila SAP NetWeaver AS ABAP debe ser de la versión 7.50 SP02 o superior.
  + Para el sistema hub (SAP Gateway), el SAP NetWeaver AS ABAP del sistema hub debe ser de la versión 7.50 SP01 o superior para la configuración de hub remoto.

## Fuentes que no sean ODP
<a name="sap-odata-non-odp-sources"></a>
+ La versión de la pila de SAP NetWeaver debe ser 7.40 SP02 o posterior.
+ Debe habilitar el servicio de catálogo para la detección de servicios.
  + **OData V2.0**: puede habilitar los servicios de catálogo de OData V2.0 en su SAP Gateway mediante la transacción `/IWFND/MAINT_SERVICE`.
+ El servicio SAP OData debe admitir opciones de paginación o consulta del lado del cliente, como `$top` y `$skip`. También debe admitir la opción de consulta del sistema `$count`.
+ Para OAuth 2.0, debe habilitar OAuth 2.0 para el servicio OData y registrar el cliente OAuth según la documentación de SAP y configurar la redirección de URL autorizada de la siguiente manera:
  + `https://<region>.console.aws.amazon.com/gluestudio/oauth`, sustituyendo `<region>` por la región en la que se ejecuta AWS Glue, por ejemplo: us-east-1. 
  + Debe habilitar una configuración segura para conectarse a través de HTTPS.
+ Debe proporcionar una autorización requerida para que el usuario de SAP descubra los servicios y extraiga datos mediante los servicios OData de SAP. Consulte la documentación de seguridad proporcionada por SAP.

# Políticas de IAM
<a name="sap-odata-configuring-iam-permissions"></a>

## Políticas que contienen las operaciones de la API para crear y usar conexiones
<a name="sap-odata-policies-api-operations"></a>

En el siguiente ejemplo de política se describen los permisos de AWS IAM necesarios para crear y utilizar conexiones. Si va a crear un nuevo rol, cree una política que contenga lo siguiente:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:DescribeSecret",
        "secretsmanager:GetSecretValue",
        "secretsmanager:PutSecretValue"
      ],
      "Resource": "*"
    }
  ]
}
```

------

El rol debe conceder acceso a todos los recursos que utiliza el trabajo como, por ejemplo, Amazon S3. Si no desea utilizar el método anterior, puede utilizar las siguientes políticas de IAM administradas.
+ [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole): da acceso a recursos que precisan diversos procesos de AWS Glue para ejecutarse en su nombre. Entre estos recursos se incluyen AWS Glue, Amazon S3, IAM, CloudWatch Logs y Amazon EC2. Si aplica la convención de nomenclatura en los recursos especificados en esta política, los procesos de AWS Glue tienen los permisos necesarios. Normalmente, esta política se asocia a los roles que se especifican a la hora de definir rastreadores, trabajos y puntos de conexión de desarrollo.
+ [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess): otorga acceso total a los recursos de AWS Glue cuando una identidad a la que está asociada la política utiliza la Consola de administración de AWS. Si sigue la convención de nomenclatura para los recursos especificados en esta política, los usuarios dispondrán de todas las funciones de la consola. Esta política se suele adjuntar a los usuarios de la consola AWS Glue.
+ [SecretsManagerReadWrite](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/SecretsManagerReadWrite): proporciona acceso de lectura y escritura a AWS Secrets Manager a través de la Consola de administración de AWS. Nota: Esto excluye las acciones de IAM, así que combínelas con `IAMFullAccess`, en caso de que se requiera una configuración de rotación.

**Políticas de IAM/permisos necesarios para configurar la VPC**

Se requieren los siguientes permisos de IAM al utilizar la conexión de VPC para crear la Conexión a AWS Glue. Para obtener más información, consulte [crear una política de IAM para AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html).

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeNetworkInterfaces"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

# Conectividad/Conexión de VPC
<a name="sap-odata-connectivity-vpc-connection"></a>

Pasos para la conexión de VPC:

1. Utilice la conexión de VPC existente o cree una nueva siguiendo la [Documentación de Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html).

1. Asegúrese de tener una puerta de enlace NAT que dirija el tráfico a Internet.

1. Elija el punto de conexión de VPC como puerta de enlace de Amazon S3 para crear la conexión.

1. Habilite la resolución de DNS y el nombre de host de DNS para utilizar los servicios de DNS de AWS proporcionados.

1. Vaya a la VPC creada y agregue los puntos de conexión necesarios para diferentes servicios como STS, AWS Glue o Secret Managers.

   1. Seleccione Crear punto de conexión.

   1. Para Categoría de servicio, elija Servicios de AWS.

   1. En Nombre del servicio, elija el nombre del servicio con el que se va a conectar.

   1. Elija VPC y Habilitar el nombre de DNS.

   1. Puntos de conexión de VPC necesarios para la conexión de VPC:

      1. [STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sts_vpc_endpoint_create.html)

      1. [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/vpc-interface-endpoints.html)

      1. [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)

## Configuración del grupo de seguridad
<a name="sap-odata-security-group-configuration"></a>

El grupo de seguridad debe permitir que el tráfico llegue a su puerto de escucha desde la VPC de AWS Glue para que AWS Glue pueda conectarse a él. Una práctica recomendada es restringir el rango de direcciones IP de origen tanto como sea posible. 

AWS Glue requiere un grupo de seguridad especial que permita todo el tráfico entrante desde sí mismo. Puede crear una regla con autorreferencia que permita todo el tráfico que se origine en el grupo de seguridad. Puede modificar un grupo de seguridad existente y especificar el grupo de seguridad como origen.

Abra la comunicación desde los puertos HTTPS del punto de conexión de la URL (ya sea un NLB o una instancia SAP).

## Opciones de conectividad
<a name="sap-odata-connectivity-options"></a>
+ Conexión HTTPS con NLB interno y externo, certificado SSL de la entidad de certificación (CA), SSL no certificado autofirmado
+ Conexión HTTPS con certificado SSL de instancia SAP de la autoridad de certificación (CA), no certificado SSL autofirmado

# Autenticación SAP
<a name="sap-odata-authentication"></a>

El conector SAP admite los métodos de autenticación CUSTOM (se trata de la autenticación SAP BASIC) y OAUTH.

## Autenticación personalizada
<a name="sap-odata-custom-authentication"></a>

AWS Glue admite Custom (autenticación básica) como método para establecer conexiones con sus sistemas SAP, lo que permite el uso de un nombre de usuario y una contraseña para un acceso seguro. Este tipo de autenticación funciona bien en escenarios de automatización, ya que permite utilizar el nombre de usuario y la contraseña por adelantado con los permisos de un usuario en particular en la instancia de SAP OData. AWS Glue puede usar el nombre de usuario y la contraseña para autenticar las API de SAP OData. En AWS Glue, la autorización básica se implementa como autorización personalizada.

Para ver la documentación pública de SAP OData sobre el flujo de autenticación básica, consulte [HTTP Basic Authentication](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/5c8bca0af1654b05a83193b2922dcee2.html).

## Autenticación OAuth 2.0
<a name="sap-odata-oauth-2.0-authentication"></a>

AWS Glue también es compatible con OAuth 2.0 como mecanismo de autenticación seguro para establecer conexiones con sus sistemas SAP. Esto permite una integración perfecta, al tiempo que garantiza el cumplimiento de los estándares de autenticación modernos y mejora la seguridad del acceso a los datos.

## Tipo de concesión AUTHORIZATION\$1CODE
<a name="sap-odata-authentication-code-grant-type"></a>

El tipo de concesión determina cómo se comunica AWS Glue con SAP OData para solicitar el acceso a sus datos. SAP OData solo admite el tipo de concesión `AUTHORIZATION_CODE`. Este tipo de concesión se considera un OAuth de “tres vías”, ya que se basa en redirigir a los usuarios al servidor de autorización externo para autenticar al usuario. Se utiliza para crear conexiones a través de la consola de AWS Glue. 

Los usuarios aún pueden optar por crear su propia aplicación conectada en SAP OData y proporcionar su propio ID y secreto de cliente al crear conexiones a través de la consola de AWS Glue. En este escenario, aún se abrirá SAP OData para iniciar sesión y autorizar a AWS Glue para que acceda a sus recursos.

Este tipo de concesión da como resultado un token de actualización y un token de acceso. El token de acceso es de corta duración y se puede actualizar automáticamente sin la interacción del usuario mediante el token de actualización.

Para ver la documentación pública de SAP OData sobre la creación de una aplicación conectada para el flujo de OAuth con código de autorización, consulte [Authentication Using OAuth 2.0](https://help.sap.com/docs/ABAP_PLATFORM_NEW/e815bb97839a4d83be6c4fca48ee5777/2e5104fd87ff452b9acb247bd02b9f9e.html).

# AWS Secrets Manager para almacenar su secreto de autenticación
<a name="sap-odata-aws-secret-manager-auth-secret"></a>

Tendrá que almacenar los secretos de la conexión de OData de SAP en AWS Secrets Manager, configurar los permisos necesarios para la recuperación tal y como se especifica en la sección [Políticas de IAM](sap-odata-configuring-iam-permissions.md) y utilizarlos al crear una conexión.

Utilice la Consola de administración de AWS de AWS Secrets Manager para crear un secreto para su origen de SAP. Para obtener más información, consulte [Crear un secreto de AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html). Los detalles en AWS Secrets Manager deben incluir los elementos presentes en el siguiente código. 

## Secreto de autenticación personalizado
<a name="sap-odata-custom-auth-secret"></a>

Tendrá que ingresar su nombre de usuario del sistema SAP en lugar de *<su nombre de usuario de SAP>* y su contraseña en lugar de *<su contraseña de nombre de usuario de SAP>* y True o False. En este contexto, cambiar `basicAuthDisableSSO` a `true` desactiva el inicio de sesión único (SSO) para las solicitudes de autenticación básica, exigiendo credenciales de usuario explícitas para cada solicitud. Por el contrario, establecerlo en `false` permite el uso de las sesiones de SSO existentes, si están disponibles.

```
{
   "basicAuthUsername": "<your SAP username>",
   "basicAuthPassword": "<your SAP username password>",
   "basicAuthDisableSSO": "<True/False>",
   "customAuthenticationType": "CustomBasicAuth"
}
```

## Secreto de OAuth 2.0
<a name="sap-odata-oauth-2.0-secret"></a>

En caso de que utilice OAuth 2.0 como mecanismo de autenticación, el secreto en AWS Secrets Manager debe tener el **ClientId de la aplicación cliente gestionada por el usuario** con el siguiente formato. Tendrá que ingresar su secreto de cliente SAP en lugar de <su secreto de cliente>.

```
{"USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET": "<your client secret>"
}
```

# Creación de conexiones de
<a name="sap-odata-creating-connections"></a>

Configuración de una conexión de SAP OData:

1. Inicie sesión en la consola de administración de AWS y abra la [consola de AWS Glue](https://console.aws.amazon.com/glue). En el AWS Glue Studio, siga los pasos que se indican a continuación para crear una conexión:

   1. En el panel izquierdo, haga clic en Conexiones de datos.

   1. Haga clic en Crear conexión.

   1. Seleccione **SAP OData** en **Elegir origen de datos**

   1. Proporcione la **URL del host de la aplicación** de la instancia de SAP OData a la que quiere conectarse. Esta URL del host de la aplicación debe ser accesible a través de Internet pública para una conexión que no sea de VPC.

   1. Proporcione la **Ruta del servicio de aplicación** de la instancia de SAP OData a la que quiere conectarse. Es la misma que la ruta del servicio de catálogo. Por ejemplo: `/sap/opu/odata/iwfnd/catalogservice;v=2`. AWS Glue no acepta una ruta de objeto específica.

   1. Proporcione el **Número de cliente** de la instancia de SAP OData a la que quiere conectarse. Los valores admitidos son [001-999].. Ejemplo: 010

   1. Proporcione el **Número de puerto** de la instancia de SAP OData a la que quiere conectarse. Ejemplo: 443

   1. Proporcione el **Idioma de inicio de sesión** de la instancia de SAP OData a la que quiere conectarse. Ejemplo: EN

   1. Seleccione el rol de AWS IAM que AWS Glue pueda asumir y que tenga los permisos descritos en la sección [Políticas de IAM](sap-odata-configuring-iam-permissions.md).

   1. Seleccione el **Tipo de autenticación** que quiere utilizar para esta conexión en AWS Glue de la lista del menú desplegable: OAUTH2 o CUSTOM

      1. CUSTOM: seleccione el secreto que creó tal como se especifica en la sección [AWS Secrets Manager para almacenar su secreto de autenticación](sap-odata-aws-secret-manager-auth-secret.md).

      1. OAUTH 2.0: ingrese las siguientes entradas solo en el caso de OAuth 2.0:

         1. En **ClientId de la aplicación cliente gestionada por el usuario**, ingrese su ID de cliente.

         1. `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET` (su secreto de cliente) en el AWS Secrets Manager que creó en la sección [AWS Secrets Manager para almacenar su secreto de autenticación](sap-odata-aws-secret-manager-auth-secret.md).

         1. En **URL del código de autorización**, ingrese la URL del código de autorización.

         1. En **URL de los tokens de autorización**, ingrese la URL del token de autorización.

         1. En **Ámbitos de OAuth**, introduzca sus ámbitos de OAuth separados por espacios. Ejemplo: `/IWFND/SG_MED_CATALOG_0002 ZAPI_SALES_ORDER_SRV_0001`

   1. Seleccione las opciones de red si quiere usar su red. Para obtener más información, consulta [Conectividad/Conexión de VPC](sap-odata-connectivity-vpc-connection.md).

1. Conceda el rol de IAM asociado a su permiso de trabajo de AWS Glue para leer `secretName`. Para obtener más información, consulte [Políticas de IAM](sap-odata-configuring-iam-permissions.md).

1. Elija **Probar conexión** y pruebe su conexión. Si la prueba de conexión es satisfactoria, haga clic en siguiente, ingrese el nombre de su conexión y guárdela. La funcionalidad de prueba de conexión no está disponible si ha elegido Opciones de red (VPC). 

# Creación de un trabajo de SAP OData
<a name="sap-odata-creating-job"></a>

Consulte [Creación de trabajos de Visual ETL con AWS Glue Studio](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)

# Orígenes de aprovisionamiento de datos operativos (ODP)
<a name="sap-odata-operational-data-provisioning-sources"></a>

El aprovisionamiento de datos operativos (ODP) proporciona una infraestructura técnica que puede utilizar para respaldar la extracción y replicación de datos para diversas aplicaciones de destino y admite mecanismos delta en estos escenarios. En el caso de un procedimiento delta, los datos de un origen (proveedor de ODP) se escriben automáticamente en una cola delta (cola delta operativa, ODQ) mediante un proceso de actualización, o se pasan a la cola delta mediante una interfaz de extracción. Un proveedor de ODP puede ser un DataSource (extractores), vistas de ABAP Core Data Services (vistas de ABAP CDS), SAP BW o SAP BW/4HANA, SAP Landscape Transformation Replication Server (SLT) y vistas de información de SAP HANA (vistas de cálculo). Las aplicaciones de destino (denominadas “suscriptores” de ODQ o, más generalmente, “consumidores de ODP”) recuperan los datos de la cola delta y continúan procesándolos.

## Carga completa
<a name="sap-odata-full-load"></a>

En el contexto de las entidades OData y ODP de SAP, una **carga completa** se refiere al proceso de extraer todos los datos disponibles de una entidad ODP en una sola operación. Esta operación recupera el conjunto de datos completo del sistema de origen, lo que garantiza que el sistema de destino tenga una copia completa y actualizada de los datos de la entidad. Las cargas completas se suelen utilizar para orígenes que no admiten cargas incrementales o cuando es necesario actualizar el sistema de destino.

**Ejemplo**

Puede establecer la marca `ENABLE_CDC` de forma explícita en false al crear el DynamicFrame. Nota: `ENABLE_CDC` es false de forma predeterminada. Si no quiere inicializar la cola delta, no tiene que enviar esta marca ni establecerla en true. Si no se establece esta marca en true, se realizará una extracción de carga completa.

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "false"
    }, transformation_ctx=key)
```

## Carga incremental
<a name="sap-odata-incremental-load"></a>

Una **carga incremental** en el contexto de las entidades ODP (Aprovisionamiento de datos operativos) implica extraer solo los datos nuevos o modificados (deltas) del sistema de origen desde la última extracción de datos, evitando el reprocesamiento de los registros ya procesados. Este enfoque mejora considerablemente la eficiencia, reduce los volúmenes de transferencia de datos, mejora el rendimiento, garantiza la sincronización efectiva entre sistemas y minimiza el tiempo de procesamiento, especialmente en el caso de conjuntos de datos grandes que cambian con frecuencia.

# Transferencias incrementales basadas en tokens Delta
<a name="sap-odata-incremental-transfers"></a>

Para habilitar la transferencia incremental mediante la Captura de datos de cambios (CDC) para las entidades habilitadas para ODP que la admiten, siga estos pasos:

1. Cree el trabajo de transferencia incremental en modo script.

1. Al crear el marco de datos o el DynamicFrame de Glue, debe pasar la opción `"ENABLE_CDC": "True"`. Esta opción garantiza que recibirá un token Delta de SAP, que podrá utilizar para recuperar posteriormente los datos modificados.

El token Delta estará presente en la última fila del marco de datos, en la columna DELTA\$1TOKEN. Este token puede utilizarse como opción de conexión en llamadas posteriores para recuperar de forma incremental el siguiente conjunto de datos.

**Ejemplo**
+ Establecemos la marca `ENABLE_CDC` en `true` al crear el DynamicFrame. Nota: `ENABLE_CDC` es `false` de forma predeterminada. Si no quiere inicializar la cola delta, no necesita enviar esta marca ni establecerla como verdadera. No establecer esta marca como verdadera resultará en una extracción de carga completa.

  ```
  sapodata_df = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          "ENABLE_CDC": "true"
      }, transformation_ctx=key)
  
  # Extract the delta token from the last row of the DELTA_TOKEN column
  delta_token_1 = your_logic_to_extract_delta_token(sapodata_df) # e.g., D20241029164449_000370000
  ```
+ El token delta extraído puede pasarse como opción para recuperar nuevos eventos.

  ```
  sapodata_df_2 = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          // passing the delta token retrieved in the last run
          "DELTA_TOKEN": delta_token_1
      } , transformation_ctx=key)
  
  # Extract the new delta token for the next run
  delta_token_2 = your_logic_to_extract_delta_token(sapodata_df_2)
  ```

Tenga en cuenta que el último registro, en el que `DELTA_TOKEN` está presente, no es un registro transaccional del origen y solo existe con la finalidad de pasar el valor del token delta.

Además de `DELTA_TOKEN`, se devuelven los siguientes campos en cada fila del marco de datos. 
+ **GLUE\$1FETCH\$1SQ**: se trata de un campo de secuencia, generado a partir de la marca de tiempo de EPOC en el orden en que se recibió el registro, y es único para cada registro. Se puede utilizar si necesita conocer o establecer el orden de los cambios en el sistema de origen. Este campo solo estará presente para las entidades habilitadas para ODP.
+ **DML\$1STATUS**: esto mostrará `UPDATED` para todos los registros recién insertados y actualizados a partir del origen y `DELETED` para los registros que se hayan eliminado del origen.

Para obtener más información sobre cómo gestionar el estado y reutilizar el token delta para recuperar los registros modificados a través de un ejemplo, consulte la sección [Uso del script de administración de estado de SAP OData](sap-odata-state-management-script.md).

## Invalidación del token Delta
<a name="sap-odata-invalidation"></a>

Un token delta está asociado a la colección de servicios y a un usuario. Si se inicia una nueva extracción inicial con `“ENABLE_CDC” : “true”` para la misma colección de servicios y para el mismo usuario, el servicio OData de SAP invalidará todos los tokens delta anteriores emitidos como resultado de una inicialización anterior. Invocar el conector con un token delta caducado provocará una excepción: 

`Could not open data access via extraction API RODPS_REPL_ODP_OPEN` 

# Servicios OData (orígenes que no son ODP)
<a name="sap-odata-non-odp-services"></a>

## Carga completa
<a name="sap-odata-non-odp-full-load"></a>

Para los sistemas que no son ODP (Aprovisionamiento de datos operativos), una **carga completa** implica extraer todo el conjunto de datos del sistema de origen y cargarlo en el sistema de destino. Dado que los sistemas que no son ODP no son compatibles de por sí con mecanismos avanzados de extracción de datos, como los deltas, el proceso es sencillo, pero puede requerir muchos recursos en función del tamaño de los datos.

## Carga incremental
<a name="sap-odata-non-odp-incremental-load"></a>

Para los sistemas o entidades que no admiten el **ODP (Aprovisionamiento de datos operativos)**, la transferencia incremental de datos se puede gestionar manualmente mediante la implementación de un mecanismo basado en marcas de tiempo para seguir y extraer los cambios.

**Transferencias incrementales basadas en marca temporal**

Para las entidades no habilitadas para ODP (o para las entidades habilitadas para ODP que no usan la marca ENABLE\$1CDC), puede usar una opción `filteringExpression` en el conector para indicar el intervalo de `datetime` para el que se quiere recuperar los datos. Este método se basa en un campo de fecha y hora en los datos que representa cuándo se creó o modificó cada registro por última vez.

**Ejemplo**

Recuperar registros que se modificaron después de 2024-01-01T00:00:00.000

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

Nota: En este ejemplo, `LastChangeDateTime` es el campo que representa cuándo se modificó por última vez cada registro. El nombre real del campo puede variar en función de la entidad específica de SAP OData.

Para obtener un nuevo subconjunto de datos en las siguientes ejecuciones, debe actualizar la opción `filteringExpression` con una nueva marca de tiempo. Normalmente, sería el valor máximo de la marca de tiempo de los datos recuperados anteriormente.

**Ejemplo**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

En la siguiente sección, proporcionaremos un enfoque automatizado para gestionar estas transferencias incrementales basadas en marcas de tiempo, lo que elimina la necesidad de actualizar manualmente la expresión de filtrado entre ejecuciones.

# Escribir en SAP OData
<a name="sap-odata-writing"></a>

 En esta sección se describe cómo escribir datos en su servicio SAP OData mediante el conector de AWS Glue para SAP OData. 

**Requisitos previos**
+ Acceso a un servicio de SAP OData
+ Un objeto de SAP OData EntitySet en el que le gustaría escribir. Necesitará el nombre del objeto.
+ Credenciales de SAP OData válidas y una conexión válida
+ Permisos adecuados, tal como se describe en las políticas de [IAM](https://docs.aws.amazon.com/glue/latest/dg/sap-odata-configuring-iam-permissions.html)

El conector de SAP OData admite dos operaciones de escritura:
+ INSERT
+ UPDATE

Al usar la operación de escritura UPDATE, debe proporcionar ID\$1FIELD\$1NAMES para especificar el campo de ID externo de los registros.

**Ejemplo:**

```
sapodata_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "WRITE_OPERATION": "INSERT"
    }
```

# Uso del script de administración de estado de SAP OData
<a name="sap-odata-state-management-script"></a>

Para utilizar el script de administración de estado de SAP OData en el trabajo de AWS Glue, haga lo siguiente:
+ Descargue el script de gestión de estado: `s3://aws-blogs-artifacts-public/artifacts/BDB-4789/sap_odata_state_management.zip ` desde el bucket público de Amazon S3.
+ Cargue el script en un bucket de Amazon S3 al que el trabajo de AWS Glue tenga permiso de acceso.
+ Referencia al script de su trabajo de AWS Glue: al crear o actualizar su trabajo de AWS Glue, pase la opción `'--extra-py-files'` para hacer referencia a la ruta del script en el bucket de Amazon S3. Por ejemplo: `--extra-py-files s3://your-bucket/path/to/sap_odata_state_management.py`
+ Importe y use la biblioteca de administración de estados en los scripts del trabajo de AWS Glue.

## Ejemplo de transferencias incrementales basadas en tokens Delta
<a name="sap-odata-delta-token-incremental-transfer"></a>

A continuación, se muestra un ejemplo de cómo usar el script de administración de estados para transferencias incrementales basadas en token delta:

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

## Ejemplo de transferencias incrementales basadas en marca temporal
<a name="sap-odata-timestamp-incremental-transfer"></a>

A continuación, se muestra un ejemplo de cómo usar el script de administración de estados para transferencias incrementales basadas en token delta:

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

En ambos ejemplos, el script de administración del estado administra las complejidades del almacenamiento del estado (ya sea un token delta o una marca de tiempo) entre las ejecuciones de los trabajos. Recupera automáticamente el último estado conocido al obtener las opciones del conector y actualiza el estado después del procesamiento, lo que garantiza que cada trabajo que se ejecute solo procese datos nuevos o modificados.

# Particiones para entidades que no sean ODP
<a name="sap-odata-non-odp-entities-partitioning"></a>

En Apache Spark, el particionamiento se refiere a la forma en que los datos se dividen y distribuyen entre los nodos de trabajo de un clúster para su procesamiento paralelo. Cada partición es un fragmento lógico de datos que una tarea puede procesar de forma independiente. El particionamiento es un concepto fundamental en Spark que afecta directamente al rendimiento, la escalabilidad y la utilización de los recursos. Los trabajos de AWS Glue utilizan el mecanismo de particionamiento de Spark para dividir el conjunto de datos en fragmentos más pequeños (particiones) que se pueden procesar en paralelo en los nodos de trabajo del clúster. Tenga en cuenta que el particionamiento no se aplica a las entidades ODP.

Para obtener más información, consulte [AWS GlueTrabajos de Spark y PySpark](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html).

**Requisitos previos**

Un Objeto de SAP OData desde el cual desearía leer. Necesitará el nombre del objeto/EntitySet. Por ejemplo: ` /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder `.

**Ejemplo**

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

## Consultas de partición
<a name="sap-odata-partitioning-queries"></a>

### Partición basada en campos
<a name="sap-odata-field-based-partitioning"></a>

Puede proporcionar las opciones adicionales de Spark `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` y `NUM_PARTITIONS` si quiere utilizar la simultaneidad en Spark. Con estos parámetros, la consulta original se dividiría en un número `NUM_PARTITIONS` de subconsultas que las tareas de Spark pueden ejecutar simultáneamente. Los campos Entero, Fecha y hora y Fecha admiten la partición basada en campos en el conector SAP OData.
+ `PARTITION_FIELD`: el nombre del campo que se utilizará para particionar la consulta.
+ `LOWER_BOUND`: un valor de límite inferior inclusivo del campo de partición elegido.

   En cualquier campo cuyo tipo de dato sea DateTime, se acepta el formato de marca de tiempo de Spark que se utiliza en las consultas de Spark SQL.

  Ejemplos de valores válidos: `"2000-01-01T00:00:00.000Z"` 
+ `UPPER_BOUND`: un valor límite superior exclusivo del campo de partición elegido.
+ `NUM_PARTITIONS`: el número de particiones.
+ `PARTITION_BY`: el tipo de particionamiento que se va a realizar, `FIELD` se debe pasar en caso de particionamiento basado en Campos.

**Ejemplo**

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

### Partición basada en registros
<a name="sap-odata-record-based-partitioning"></a>

La consulta original se dividiría en un número `NUM_PARTITIONS` de subconsultas que las tareas de Spark pueden ejecutar simultáneamente.

La partición basada en registros solo se admite para entidades que no son de ODP, ya que la paginación en las entidades de ODP se admite a través del siguiente token o token de omisión.
+ `PARTITION_BY`: el tipo de particionamiento que se va a realizar. `COUNT` se debe pasar en caso de particionamiento basado en registros.

**Ejemplo**

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

# Limitaciones/Avisos
<a name="sap-odata-limitations"></a>
+ Las entidades ODP no son compatibles con la partición basada en registros, ya que la paginación se gestiona mediante un token de omisión o token delta. En consecuencia, para la partición basada en registros, el valor predeterminado de maxConcurrency se establece en “null”, independientemente de la entrada del usuario.
+ Cuando se aplican un límite y una partición, el límite prevalece sobre el particionamiento.

# Opciones de conexión de SAP OData
<a name="sap-odata-connection-options"></a>

Las siguientes son opciones de conexión para SAP OData:
+ `ENTITY_NAME`(cadena): (obligatorio) se usa para lectura. El nombre del objeto en SAP OData.

  Por ejemplo: /sap/opu/odata/sap/API\$1SALES\$1ORDER\$1SRV/A\$1SalesOrder
+ `API_VERSION`(cadena): (opcional) Se usa para leer. Versión de la API de REST de SAP OData que quiere usar. Ejemplo: 2.0.
+ `SELECTED_FIELDS`(lista<Cadena>): predeterminado: empty(SELECT \$1). Se usa para leer. Columnas que desee seleccionar para el objeto.

  Por ejemplo: SalesOrder
+ `FILTER_PREDICATE`(cadena): predeterminado: vacío. Se usa para leer. Debe estar en el formato de Spark SQL.

  Por ejemplo: `SalesOrder = "10"`
+ `QUERY`(cadena): predeterminado: vacío. Se usa para leer. Consulta completa de Spark SQL.

  Por ejemplo: `SELECT * FROM /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder`
+ `PARTITION_FIELD`(cadena): se usa para leer. Campo que se utilizará para particionar la consulta.

  Por ejemplo: `ValidStartDate`
+ `LOWER_BOUND`(cadena): se usa para leer. Un valor de límite inferior inclusivo del campo de partición elegido.

  Por ejemplo: `"2000-01-01T00:00:00.000Z"`
+ `UPPER_BOUND`(cadena): se usa para leer. Un valor límite superior exclusivo del campo de partición elegido.

  Por ejemplo: `"2024-01-01T00:00:00.000Z"`
+ `NUM_PARTITIONS`(entero): predeterminado: 1. Se usa para leer. Número de particiones para leer.
+ `INSTANCE_URL`(cadena): la URL del host de la aplicación de la instancia de SAP.

  Por ejemplo: `https://example-externaldata.sierra.aws.dev`
+ `SERVICE_PATH`(cadena): la ruta del servicio de la aplicación de la instancia de SAP.

  Por ejemplo: `/sap/opu/odata/iwfnd/catalogservice;v=2`
+ `CLIENT_NUMBER`(cadena): el número de cliente de la aplicación de la instancia de SAP.

  Por ejemplo: 100
+ `PORT_NUMBER`(cadena). Valor predeterminado: el número de puerto de la aplicación de la instancia de SAP.

  Por ejemplo: 443
+ `LOGON_LANGUAGE`(cadena): idioma de inicio de sesión de la aplicación de instancias de SAP.

  Por ejemplo: `EN`
+ `ENABLE_CDC`(cadena): define si se debe ejecutar un trabajo con CDC habilitado, es decir, con el seguimiento de los cambios.

  Por ejemplo: `True/False`
+ `DELTA_TOKEN`(cadena): ejecuta una extracción de datos incremental basada en el token Delta válido proporcionado. 

  Por ejemplo: `D20241107043437_000463000`
+ `PAGE_SIZE`(entero): define el tamaño de la página para consultar los registros. El tamaño de página predeterminado es 50 000. Cuando se especifica un tamaño de página, SAP devuelve solo el número definido de registros por llamada a la API, en lugar del conjunto de datos completo. El conector seguirá proporcionando el número total de registros y gestionará la paginación utilizando el tamaño de página que especificó. Si necesita un tamaño de página mayor, puede elegir cualquier valor de hasta 500 000, el cual es el máximo permitido. Se ignorará cualquier tamaño de página especificado superior a 500 000. En su lugar, el sistema utilizará el tamaño de página máximo permitido. Puede especificar el tamaño de página en la interfaz de usuario de AWS Glue Studio agregando una opción de conexión `PAGE_SIZE` con el valor que desee. 

  Por ejemplo: `20000`

# Detalles de la entidad y del campo de SAP OData
<a name="sap-odata-entity-field-details"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/glue/latest/dg/sap-odata-entity-field-details.html)