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

Dovrai creare 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 fatturazione abilitata o crea un account di prova senza costi di 90 giorni per Google Cloud Platform.
  • GUI SAP (Windows o Java) installata nel sistema. Se la GUI SAP è già installata sul tuo laptop, connettiti utilizzando l'indirizzo IP esterno della VM come IP server delle applicazioni. Se usi Mac, puoi anche installare la GUI SAP per Java disponibile in questo link.

3. Prima di iniziare

6757b2fb50ddcc2d.png

  • Esegui questi comandi in Cloud Shell per eseguire l'autenticazione per il tuo account e imposta 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 comandi seguenti 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 in cui è installato l'SDK ABAP per Google Cloud.
  • Devi completare il codelab 1 (Installare la prova della piattaforma ABAP 1909 sulla piattaforma Google Cloud e installare l'SDK ABAP per Google Cloud) e il codelab 2 (Configurare l'autenticazione dell'SDK ABAP mediante token per SAP ospitato sulla VM di Compute Engine) prima di procedere con questo codelab.
  • Se hai completato il codelab 1 e il codelab 2, avrai eseguito il provisioning di un sistema 1909 di prova della piattaforma ABAP 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 a disposizione l'infrastruttura e la connettività necessarie per eseguire i passaggi indicati in questo codelab. Pertanto, devi completare il codelab 1 e il codelab 2 prima di procedere con questo codelab.

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

  1. Dalla console 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

Una volta completata l'esecuzione, dovresti vedere un messaggio come mostrato di seguito

b5f52859df2c2f56.png

A questo punto dovresti avere abilitato l'API BigQuery nel tuo progetto Google Cloud.

5. Creare un account di servizio per l'accesso sicuro a BigQuery

Per ottenere in modo sicuro le previsioni ML da un modello BigQuery ML, devi creare un account di servizio con i ruoli Utente job BigQuery e Visualizzatore dati BigQuery, che consentirà 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 account di servizio 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 all'account di servizio 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 del tuo progetto.

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

6. Creazione di un modello di BigQuery Machine Learning

In questo codelab, creeremo un modello K-means per raggruppare il set di dati sui noleggi di biciclette di Londra. Puoi applicare l'algoritmo k-means per raggruppare i dati in cluster. A differenza del machine learning supervisionato, che riguarda l'analisi predittiva, l'apprendimento non supervisionato riguarda l'analisi descrittiva. Si tratta di comprendere i dati in modo da 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 di BigQuery
  2. Nel riquadro Explorer, fai clic sul nome del tuo progetto.
  3. Fai clic su 5cf3b742649f1e2c.png Visualizza azioni > Crea il set di dati.

3fbc072041bfa313.png

  1. Nella pagina Crea set di dati, segui questi passaggi:
  • In ID set di dati, inserisci bqml_tutorial.
  • In Tipo di località, seleziona Più regioni, quindi seleziona UE (più regioni nell'Unione Europea). Il set di dati pubblico di London Noleggio biciclette è archiviato nell'UE multiregionale. 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.

Creare un modello K-means

Ora che il set di dati è configurato, il passaggio successivo è 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 quindi su london_station_clusters.
  2. Fai clic sulla scheda Schema. Lo schema del modello elenca i tre attributi delle stazioni che BigQuery ML ha utilizzato per eseguire il clustering. Lo schema dovrebbe essere simile al seguente:

5f1feb313bd0f6a5.png

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

8f9b53971e33dc08.png

7. Ottieni previsioni BigQuery ML utilizzando l'SDK ABAP per Google Cloud

Ora che hai configurato i prerequisiti per Google Cloud, puoi completare i passaggi nel tuo sistema SAP per ottenere previsioni dal modello ML utilizzando l'SDK ABAP per Google Cloud.

Crea configurazione chiave client

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

Per mantenere la configurazione nella tabella /GOOG/CLIENT_KEY:

  1. Nella GUI di SAP, inserisci il codice della transazione SPRO.
  2. Fai clic su IMG di riferimento SAP.
  3. Fai clic su SDK ABAP per Google Cloud > Impostazioni di base > Configura chiave client

25871e639293b9ee.png

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

Campo

Valore

Nome 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

Classe di autorizzazione

/GOOG/CL_AUTH_GOOGLE

Creazione di un report ABAP per ottenere previsioni dal modello BigQuery ML

Per creare un report ABAP, segui questi passaggi:

  1. Nella GUI di SAP, vai al codice transazione SE38 e crea un programma di report con il nome ZDEMO_BIGQUERY_ML_PREDICT.
  2. Nella finestra popup che si apre, fornisci i dettagli come illustrato 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).

Una volta eseguita correttamente, dovresti vedere un output del report come mostrato di seguito:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Complimenti

Ottimo lavoro per aver completato il corso "Ottieni previsioni da un modello BigQuery Machine Learning (ML) utilizzando l'SDK ABAP per Google Cloud" codelab!

Hai recuperato 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. Espandi i tuoi orizzonti con altri interessanti SDK ABAP per i codelab di Google Cloud:

  • Utilizzo dell'API Translation con l'SDK ABAP per Google Cloud
  • carica un oggetto di grandi dimensioni in un bucket Cloud Storage utilizzando il chunking
  • Recupero di credenziali/secret da Secret Manager con l'SDK ABAP per Google Cloud
  • Chiama 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 Compute:
gcloud compute instances delete abap-trial-docker
  1. Elimina le regole firewall:
gcloud compute firewall-rules delete sapmachine
  1. Elimina l'account di servizio:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com