Leggere le previsioni di BigQuery ML in SAP utilizzando l'SDK ABAP per Google Cloud

1. Introduzione

In questo codelab creerai un modello di machine learning (ML) in BigQuery e otterrai previsioni da questo modello utilizzando l'SDK ABAP per Google Cloud.

Utilizzerai i seguenti servizi Google Cloud:

  • BigQuery
  • Cloud Shell

Cosa creerai

Creerai quanto segue:

  • Un modello BigQuery Machine Learning (ML).
  • Un account di servizio con il ruolo Utente job BigQuery per chiamare l'API BigQuery.
  • Un programma ABAP per chiamare l'API BigQuery e ottenere previsioni dal modello ML.

2. Requisiti

  • Un browser, ad esempio Chrome o Firefox.
  • Un progetto Google Cloud con la fatturazione abilitata o crea un account di prova senza costi di 90 giorni per Google Cloud.
  • GUI SAP (Windows o Java) installata nel sistema. Se SAP GUI è già installato sul tuo laptop, connettiti a SAP utilizzando l'indirizzo IP esterno della VM come IP del server applicazioni. Se utilizzi Mac, puoi anche installare SAP GUI per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui questi comandi in Cloud Shell per autenticarti per il tuo account e impostare il progetto predefinito su abap-sdk-poc. La zona us-west4-b viene utilizzata come esempio. Se necessario, modifica il progetto e la zona nei seguenti comandi in base alle tue preferenze.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Devi avere accesso a un sistema SAP con ABAP SDK for Google Cloud installato.
  • Prima di procedere con questo codelab, devi completare il codelab 1 (Installare la versione di prova della piattaforma ABAP 1909 su Google Cloud Platform e installare l'SDK ABAP per Google Cloud) e il codelab 2 (Configurare l'autenticazione dell'SDK ABAP utilizzando i token per SAP ospitato sulla VM Compute Engine).
  • Se hai completato il codelab 1 e il codelab 2, avrai eseguito il provisioning di un sistema di prova della piattaforma ABAP 1909 su Google Cloud, insieme alla configurazione richiesta per l'autenticazione e la connettività.
  • Se non hai completato il codelab 1 e il codelab 2, non avrai tutta l'infrastruttura e la connettività necessarie per eseguire i passaggi forniti in questo codelab. Pertanto, devi completare il codelab 1 e il codelab 2 prima di procedere con questo codelab.

4. Abilitare l'API BigQuery V2 nel tuo progetto Google Cloud

  1. Nella console Google Cloud, fai clic su Attiva Cloud Shell nell'angolo in alto a destra:

6757b2fb50ddcc2d.png

  1. Esegui questi comandi in Cloud Shell per abilitare l'API BigQuery:
gcloud services enable bigquery.googleapis.com

Se l'esecuzione va a buon fine, dovresti visualizzare un messaggio come mostrato di seguito

b5f52859df2c2f56.png

Ora dovresti aver attivato l'API BigQuery nel tuo progetto Google Cloud.

5. Crea un service account per l'accesso sicuro a BigQuery

Per ottenere in modo sicuro le previsioni di ML da un modello BigQuery ML, devi creare un service account con i ruoli Utente job BigQuery e Visualizzatore dati BigQuery, che consentiranno al tuo programma di eseguire query (come job) all'interno del progetto e leggere i dati dalle tabelle. Questo ruolo concede solo l'autorizzazione necessaria per creare job e leggere dati, riducendo al minimo i rischi per la sicurezza.

Creare un account di servizio

Per creare un service account con il ruolo richiesto, segui questi passaggi:

  1. Esegui questo comando nel terminale Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Ora aggiungi i ruoli richiesti al service account creato nel passaggio precedente:
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'

Il comando precedente utilizza abap-sdk-poc come segnaposto per il progetto Google Cloud. Sostituisci abap-sdk-poc con l'ID progetto.

  1. Per verificare che il ruolo sia stato aggiunto, vai alla pagina IAM. Il service account che hai creato dovrebbe essere elencato insieme al ruolo che gli è stato assegnato.

6. Creazione di un modello BigQuery Machine Learning

In questo codelab creeremo un modello k-means per raggruppare il set di dati dei noleggi di biciclette di Londra. Puoi applicare l'algoritmo k-means per raggruppare i dati in cluster. A differenza del machine learning supervisionato, che si occupa di analisi predittiva, l'apprendimento non supervisionato si occupa di analisi descrittiva. Si tratta di comprendere i tuoi dati per poter prendere decisioni basate sui dati.

Crea il tuo set di dati

Per creare un set di dati BigQuery per archiviare il tuo modello ML, segui questi passaggi:

  1. Nella console Google Cloud, vai alla pagina BigQuery. Vai alla pagina BigQuery
  2. Nel riquadro Explorer, fai clic sul nome del progetto.
  3. Fai clic su 5cf3b742649f1e2c.png Visualizza azioni > Crea set di dati.

3fbc072041bfa313.png

  1. Nella pagina Crea set di dati:
  • In ID set di dati, inserisci bqml_tutorial.
  • Per Tipo di località, seleziona Più regioni e poi UE (più regioni nell'Unione Europea). Il set di dati pubblico London Bicycle Hires è archiviato nella località con più regioni dell'UE. Il set di dati deve trovarsi nella stessa località.
  • Lascia invariate le restanti impostazioni predefinite e fai clic su Crea set di dati. Pagina Crea set di dati.

Crea un modello K-means

Ora che il set di dati è configurato, il passaggio successivo consiste nel creare un modello k-means utilizzando i dati. Puoi creare e addestrare un modello k-means utilizzando l'istruzione CREATE MODEL con l'opzione model_type=kmeans.

Per eseguire la query e creare un modello k-means, segui questi passaggi:

  1. Vai alla pagina BigQuery. Vai a BigQuery
  2. Nel riquadro dell'editor, esegui la seguente istruzione 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. Nel pannello di navigazione, nella sezione Risorse, espandi il nome del progetto, fai clic su bqml_tutorial e poi su london_station_clusters.
  2. Fai clic sulla scheda Schema. Lo schema del modello elenca i tre attributi della stazione utilizzati da BigQuery ML per eseguire il clustering. Lo schema dovrebbe avere il seguente aspetto:

5f1feb313bd0f6a5.png

  1. Fai clic sulla scheda Valutazione. Questa scheda mostra le visualizzazioni dei cluster identificati dal modello k-means. In Funzionalità numeriche, i grafici a barre mostrano fino a 10 dei valori delle funzionalità numeriche più importanti per ogni centroide. Puoi selezionare le funzionalità da visualizzare dal menu a discesa.

8f9b53971e33dc08.png

7. Ottenere previsioni BigQuery ML utilizzando ABAP SDK for Google Cloud

Ora che hai configurato i prerequisiti sul lato Google Cloud, puoi completare i passaggi nel sistema SAP per ottenere le previsioni dal modello ML utilizzando ABAP SDK for Google Cloud.

Crea configurazione della chiave client

Per la configurazione relativa all'autenticazione e alla connettività, l'ABAP SDK for Google Cloud utilizza le tabelle /GOOG/CLIENT_KEY e /GOOG/SERVIC_MAP..

Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY, segui questi passaggi:

  1. Nella GUI SAP, inserisci il codice transazione SPRO.
  2. Fai clic su SAP Reference IMG.
  3. Fai clic su ABAP SDK for Google Cloud > Basic Settings > Configure Client Key (ABAP SDK for Google Cloud > Impostazioni di base > Configura chiave client).

25871e639293b9ee.png

  1. Mantieni i seguenti valori per i campi elencati e lascia vuoti tutti gli altri campi:

Campo

Valore

Nome della chiave Google Cloud

BIGQUERY_ML

Nome dell'account di servizio Google Cloud

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

Ambito Google Cloud

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

ID progetto

abap-sdk-poc

Authorization Class

/GOOG/CL_AUTH_GOOGLE

Creare un report ABAP per ottenere previsioni dal modello BigQuery ML

Per creare un report ABAP, svolgi i seguenti passaggi:

  1. Nella GUI SAP, vai al codice di transazione SE38 e crea un programma di report con il nome ZDEMO_BIGQUERY_ML_PREDICT.
  2. Nel popup che si apre, fornisci i dettagli come mostrato nell'immagine seguente:

4cb32d50427df294.png

  1. Nel popup successivo, seleziona Oggetto locale o fornisci un nome di pacchetto, a seconda dei casi.
  2. Nell'editor ABAP, aggiungi il seguente codice:
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. Salva e attiva il report.
  2. Esegui il report (F8).

Se l'esecuzione va a buon fine, dovresti visualizzare un output del report come mostrato di seguito:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Complimenti

Ottimo lavoro per aver completato il codelab "Get predictions from a BigQuery Machine Learning (ML) model using ABAP SDK for Google Cloud".

Hai recuperato correttamente le previsioni di un modello BigQuery Machine Learning direttamente dal tuo sistema SAP. Hai sbloccato un nuovo livello di integrazione tra ABAP e i servizi Google Cloud. Amplia i tuoi orizzonti con altri codelab entusiasmanti di ABAP SDK for Google Cloud:

  • Utilizzo dell'API Translation con ABAP SDK for Google Cloud
  • Caricare un oggetto di grandi dimensioni in un bucket Cloud Storage utilizzando la suddivisione in blocchi
  • Recuperare credenziali/secret da Secret Manager con ABAP SDK for Google Cloud
  • Chiamare Vertex AI test-bison da ABAP

9. Esegui la pulizia

Se non vuoi continuare con i codelab aggiuntivi relativi all'SDK ABAP per Google Cloud, procedi con la pulizia.

Elimina il progetto

  • Elimina il progetto Google Cloud:
gcloud projects delete abap-sdk-poc

Eliminare singole risorse

  1. Elimina l'istanza di calcolo:
gcloud compute instances delete abap-trial-docker
  1. Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
  1. Elimina il account di servizio:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com