Leer las predicciones de BigQuery ML en SAP con el SDK de ABAP para Google Cloud

1. Introducción

En este codelab, crearás un modelo de aprendizaje automático (AA) en BigQuery y obtendrás predicciones del modelo con el SDK de ABAP para Google Cloud.

Aprovecharás los siguientes servicios de Google Cloud:

  • BigQuery
  • Cloud Shell

Qué compilarás

Crearás lo siguiente:

  • Un modelo de aprendizaje automático (AA) de BigQuery
  • Una cuenta de servicio con el rol Usuario de trabajo de BigQuery para llamar a la API de BigQuery
  • Un programa ABAP para llamar a la API de BigQuery y obtener predicciones del modelo de AA

2. Requisitos

  • Un navegador, como Chrome o Firefox
  • Tener un proyecto de Google Cloud con facturación habilitada o crear una cuenta de prueba gratuita de 90 días para Google Cloud Platform
  • GUI de SAP (Windows o Java) instalada en tu sistema Si la GUI de SAP ya está instalada en tu laptop, conéctate a SAP con la dirección IP externa de la VM como la IP del servidor de aplicaciones. Si utilizas una Mac, también puedes instalar la GUI de SAP para Java disponible en este vínculo.

3. Antes de comenzar

6757b2fb50ddcc2d.png

  • Ejecuta los siguientes comandos en Cloud Shell para autenticar tu cuenta y establece el proyecto predeterminado como abap-sdk-poc. Se usa la zona us-west4-b como ejemplo. Si es necesario, cambia el proyecto y la zona en los siguientes comandos según tus preferencias.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Debes tener acceso a un sistema SAP con el SDK de ABAP para Google Cloud instalado.
  • Debes completar el codelab 1 (Instala la prueba 1909 de la plataforma ABAP en Google Cloud Platform e instala el SDK de ABAP para Google Cloud) y el codelab 2 (Cómo configurar la autenticación del SDK de ABAP con tokens para SAP alojado en la VM de Compute Engine) antes de continuar con este codelab.
  • Si completaste el codelab 1 y el 2, se te habría proporcionado un sistema ABAP de prueba 1909 de la plataforma en Google Cloud, junto con la configuración necesaria de autenticación y conectividad.
  • Si no completaste el codelab 1 y el codelab 2, no tendrás toda la infraestructura y la conectividad necesarias para realizar los pasos que se proporcionan en este codelab. Por lo tanto, debes completar el codelab 1 y el 2 antes de continuar con este codelab.

4. Habilita la API V2 de BigQuery en tu proyecto de Google Cloud

  1. En la consola de Cloud, haz clic en Activar Cloud Shell en la esquina superior derecha:

6757b2fb50ddcc2d.png

  1. Ejecuta los siguientes comandos en Cloud Shell para habilitar la API de BigQuery:
gcloud services enable bigquery.googleapis.com

Si la ejecución es exitosa, deberías ver un mensaje como el que se muestra a continuación

b5f52859df2c2f56.png

Ahora deberías tener la API de BigQuery habilitada en tu proyecto de Google Cloud.

5. Crea una cuenta de servicio para el acceso seguro a BigQuery

Para obtener predicciones del AA de forma segura a partir de un modelo de BigQuery ML, debes crear una cuenta de servicio con los roles Usuario de trabajo de BigQuery y Visualizador de datos de BigQuery, lo que permitirá que tu programa ejecute consultas (como trabajos) dentro del proyecto y lea los datos de las tablas. Este rol otorga solo los permisos necesarios para crear trabajos y leer datos, lo que minimiza los riesgos de seguridad.

Crear una cuenta de servicio

Para crear una cuenta de servicio con el rol necesario, sigue estos pasos:

  1. Ejecuta el siguiente comando en la terminal de Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Ahora agrega los roles necesarios a la cuenta de servicio creada en el paso anterior:
gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.jobUser'

gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.dataViewer'

El comando anterior usa abap-sdk-poc como marcador de posición para el proyecto de Google Cloud. Reemplaza abap-sdk-poc por el ID del proyecto.

  1. Para verificar que se agregó el rol, ve a la página IAM. La cuenta de servicio que creaste debería aparecer junto con el rol que se le asignó.

6. Crea un modelo de aprendizaje automático de BigQuery

En este codelab, crearemos un modelo de k-means para agrupar en clústeres el conjunto de datos de alquileres de bicicletas de Londres. Puedes aplicar el algoritmo k-means para agrupar tus datos en clústeres. A diferencia del aprendizaje automático supervisado, que se trata de análisis predictivo, el aprendizaje no supervisado se trata de estadísticas descriptivas. Se trata de comprender los datos para poder tomar decisiones basadas en datos.

Crea un conjunto de datos

Para crear un conjunto de datos de BigQuery a fin de almacenar tu modelo de AA, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página de BigQuery. Ir a la página de BigQuery
  2. En el panel Explorador, haz clic en el nombre de tu proyecto.
  3. Haz clic en 5cf3b742649f1e2c.png Ver acciones > Crea un conjunto de datos.

3fbc072041bfa313.png

  1. En la página Crear conjunto de datos, haz lo siguiente:
  • En ID del conjunto de datos, ingresa bqml_tutorial.
  • En Tipo de ubicación, selecciona Multirregional y, luego, UE (varias regiones en la Unión Europea). El conjunto de datos públicos de Alquileres de bicicletas de Londres se almacena en la multirregión de la UE. Tu conjunto de datos debe estar en la misma ubicación.
  • Deja la configuración predeterminada restante como está y haz clic en Crear conjunto de datos. Página Crear un conjunto de datos

Crea un modelo de k-means

Ahora que tu conjunto de datos está configurado, el siguiente paso es crear un modelo de k-means con los datos. Puedes crear y entrenar un modelo k-means mediante la sentencia CREATE MODEL con la opción model_type=kmeans.

Para ejecutar la consulta y crear un modelo de k-means, sigue estos pasos:

  1. Ve a la página de BigQuery. Ir a BigQuery
  2. En el panel del editor, ejecuta la siguiente instrucción de SQL:
CREATE OR REPLACE MODEL `bqml_tutorial.london_station_clusters`
  OPTIONS(model_type='kmeans', num_clusters=4) AS
WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
  IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    isweekday,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name, isweekday)
SELECT
  * EXCEPT(station_name, isweekday)
FROM
  stationstats
  1. En el panel de navegación, en la sección Recursos, expande el nombre de tu proyecto, haz clic en bqml_tutorial y, luego, en london_station_clusters.
  2. Haz clic en la pestaña Esquema. El esquema del modelo enumera los tres atributos de estación que BigQuery ML usó para realizar el agrupamiento en clústeres. El esquema debe verse de la siguiente manera:

5f1feb313bd0f6a5.png

  1. Haz clic en la pestaña Evaluación. En esta pestaña, se muestran visualizaciones de los clústeres identificados por el modelo de k-means. En Atributos numéricos, los gráficos de barras muestran hasta 10 de los valores de atributos numéricos más importantes para cada centroide. Puedes seleccionar qué atributos visualizar en el menú desplegable.

8f9b53971e33dc08.png

7. Obtén predicciones de BigQuery ML con el SDK de ABAP para Google Cloud

Ahora que configuraste los requisitos previos en Google Cloud, tienes todo listo para completar los pasos en tu sistema SAP y así obtener predicciones del modelo de AA con el SDK de ABAP para Google Cloud.

Crear configuración de clave de cliente

En la configuración relacionada con la autenticación y la conectividad, el SDK de ABAP para Google Cloud usa las tablas /GOOG/CLIENT_KEY y /GOOG/SERVIC_MAP..

Para mantener la configuración en la tabla /GOOG/CLIENT_KEY, sigue estos pasos:

  1. En la GUI de SAP, ingresa el código de transacción SPRO.
  2. Haz clic en IMG de referencia de SAP.
  3. Haz clic en SDK de ABAP para Google Cloud > Configuración básica > Configura la clave de cliente

25871e639293b9ee.png

  1. Mantén los siguientes valores en los campos enumerados y deja todos los demás en blanco:

Campo

Valor

Nombre de la clave de Google Cloud

BIGQUERY_ML

Nombre de la cuenta de servicio de Google Cloud

abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com

Permiso de Google Cloud

https://www.googleapis.com/auth/cloud-platform

ID del proyecto

abap-sdk-poc

Clase de autorización

/GOOG/CL_AUTH_GOOGLE

Crea un informe ABAP para obtener predicciones del modelo de BigQuery ML

Para crear un informe ABAP, sigue estos pasos:

  1. En la GUI de SAP, ve al código de transacción SE38 y crea un programa de informes con el nombre ZDEMO_BIGQUERY_ML_PREDICT..
  2. En la ventana emergente que se abre, proporciona los detalles, como se muestra en la siguiente imagen:

4cb32d50427df294.png

  1. En la siguiente ventana emergente, selecciona Local Object o proporciona un nombre de paquete según corresponda.
  2. En el Editor de ABAP, agrega el siguiente código:
REPORT zdemo_bigquery_ml_predict.

types:
  begin of lty_query_result,
    centroid_id     type i,
    station_name    type string,
    isweekday       type string,
    num_trips       type i,
    distance_from_city type string,
  end of lty_query_result,
  ltt_query_result type standard table of lty_query_result.

DATA:
  lv_project_id TYPE string,
  ls_input      TYPE /goog/cl_bigquery_v2=>ty_103,
  ls_output     TYPE lty_query_result,
  lt_output     TYPE ltt_query_result.

CONSTANTS:
  lc_newline TYPE c VALUE cl_abap_char_utilities=>newline.

TRY.
    "Initialize Bigquery object, pass the client key name that you have configured in /GOOG/CLIENT_KEY table
    DATA(lo_bq) = NEW /goog/cl_bigquery_v2( iv_key_name = 'BIGQUERY_ML' ).

    "Populate relevant parameters
    lv_project_id = lo_bq->gv_project_id.

    ls_input-default_dataset-project_id = 'abap-sdk-poc'.
    ls_input-default_dataset-dataset_id = 'bqml_tutorial'.

    "This query gets predictions from
    ls_input-query =
                | WITH | && lc_newline &&
                | hs AS ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | h.start_station_name AS station_name, | && lc_newline &&
                | IF | && lc_newline &&
                | (EXTRACT(DAYOFWEEK | && lc_newline &&
                | FROM | && lc_newline &&
                | h.start_date) = 1 | && lc_newline &&
                | OR EXTRACT(DAYOFWEEK | && lc_newline &&
                | FROM | && lc_newline &&
                | h.start_date) = 7, | && lc_newline &&
                | "weekend", | && lc_newline &&
                | "weekday") AS isweekday, | && lc_newline &&
                | h.duration, | && lc_newline &&
                | ST_DISTANCE(ST_GEOGPOINT(s.longitude, | && lc_newline &&
                | s.latitude), | && lc_newline &&
                | ST_GEOGPOINT(-0.1, | && lc_newline &&
                | 51.5))/1000 AS distance_from_city_center | && lc_newline &&
                | FROM | && lc_newline &&
                | `bigquery-public-data.london_bicycles.cycle_hire` AS h | && lc_newline &&
                | JOIN | && lc_newline &&
                | `bigquery-public-data.london_bicycles.cycle_stations` AS s | && lc_newline &&
                | ON | && lc_newline &&
                | h.start_station_id = s.id | && lc_newline &&
                | WHERE | && lc_newline &&
                | h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) | && lc_newline &&
                | AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ), | && lc_newline &&
                | stationstats AS ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | station_name, | && lc_newline &&
                | isweekday, | && lc_newline &&
                | AVG(duration) AS duration, | && lc_newline &&
                | COUNT(duration) AS num_trips, | && lc_newline &&
                | MAX(distance_from_city_center) AS distance_from_city_center | && lc_newline &&
                | FROM | && lc_newline &&
                | hs | && lc_newline &&
                | GROUP BY | && lc_newline &&
                | station_name, isweekday ) | && lc_newline &&
                | SELECT | && lc_newline &&
                | * EXCEPT(nearest_centroids_distance) | && lc_newline &&
                | FROM | && lc_newline &&
                | ML.PREDICT( MODEL `bqml_tutorial.london_station_clusters`, | && lc_newline &&
                | ( | && lc_newline &&
                | SELECT | && lc_newline &&
                | * | && lc_newline &&
                | FROM | && lc_newline &&
                | stationstats | && lc_newline &&
                | WHERE | && lc_newline &&
                | REGEXP_CONTAINS(station_name, 'Kennington'))) |.

    "Call API method: bigquery.jobs.query
    CALL METHOD lo_bq->query_jobs
      EXPORTING
        iv_p_project_id = lv_project_id
        is_input        = ls_input
      IMPORTING
        es_output       = DATA(ls_response)
        ev_ret_code     = DATA(lv_ret_code)
        ev_err_text     = DATA(lv_err_text)
        es_err_resp     = DATA(ls_err_resp).

    IF lo_bq->is_success( lv_ret_code ).
      "API Call successful, loop through the data & display the result
      IF ls_response-job_complete = abap_true.
        LOOP AT ls_response-rows ASSIGNING FIELD-SYMBOL(<ls_row>).
          LOOP AT <ls_row>-f ASSIGNING FIELD-SYMBOL(<ls_value>).
            ASSIGN <ls_value>-v->* TO FIELD-SYMBOL(<ls_field_value>).
            CASE sy-tabix.
              WHEN 1.
                ls_output-centroid_id = <ls_field_value>.
              WHEN 2.
                ls_output-station_name = <ls_field_value>.
              WHEN 3.
                ls_output-isweekday = <ls_field_value>.
              WHEN 4.
                ls_output-num_trips = <ls_field_value>.
              WHEN 5.
                ls_output-distance_from_city = <ls_field_value>.
            ENDCASE.
          ENDLOOP.
          APPEND ls_output TO lt_output.
          CLEAR ls_output.
        ENDLOOP.
        IF lt_output IS NOT INITIAL.
          cl_demo_output=>new( )->begin_section( 'ML.Predict Query Details'
                               )->write_text( ls_input-query
                               )->write_text( 'Dataset: bigquery-public-data.london_bicycles'
                               )->end_section(
                               )->begin_section( 'ML.Predict Query Results'
                               )->write_data( lt_output
                               )->end_section(
                               )->display( ).
        ENDIF.
      ENDIF.
    ELSE.
      "Display error message in case the API call fails
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    "Close HTTP Connection
    lo_bq->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lo_exception->get_text( ) TYPE 'E'.
ENDTRY.
  1. Guarda y activa el informe.
  2. Ejecuta el informe (F8).

Si la ejecución es exitosa, deberías ver un resultado del informe como el que se muestra a continuación:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Felicitaciones

Excelente trabajo al completar el curso “Obtén predicciones de un modelo de aprendizaje automático (AA) de BigQuery con el SDK de ABAP para Google Cloud” codelab!

Recuperaste con éxito predicciones de un modelo de aprendizaje automático de BigQuery, directamente desde tu sistema SAP. Desbloqueaste un nuevo nivel de integración entre ABAP y los servicios de Google Cloud. Amplía tus horizontes con otros emocionantes codelabs del SDK de ABAP para Google Cloud:

  • Usa la API de Translation con el SDK de ABAP para Google Cloud
  • Sube un objeto grande a un bucket de Cloud Storage mediante la fragmentación
  • Recupera credenciales o secretos de Secret Manager con el SDK de ABAP para Google Cloud
  • Llama a test-bison de Vertex AI desde ABAP

9. Limpia

Si no quieres continuar con los codelabs adicionales relacionados con el SDK de ABAP para Google Cloud, continúa con la limpieza.

Borra el proyecto

  • Borra el proyecto de Google Cloud:
gcloud projects delete abap-sdk-poc

Borra recursos individuales

  1. Borra la instancia de procesamiento:
gcloud compute instances delete abap-trial-docker
  1. Borra las reglas de firewall:
gcloud compute firewall-rules delete sapmachine
  1. Borra la cuenta de servicio:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com