Czytanie prognoz BigQuery ML w SAP za pomocą ABAP SDK dla Google Cloud

1. Wprowadzenie

W tym ćwiczeniu w Codelabs utworzysz model uczenia maszynowego w BigQuery i uzyskasz z niego prognozy za pomocą pakietu ABAP SDK do Google Cloud.

Będziesz korzystać z tych usług Google Cloud:

  • BigQuery
  • Cloud Shell

Co utworzysz

Utworzysz:

  • Model uczenia maszynowego BigQuery (ML).
  • Konto usługi z rolą użytkownika zadań BigQuery do wywoływania interfejsu BigQuery API.
  • Program ABAP do wywoływania interfejsu BigQuery API i uzyskiwania prognoz z modelu ML.

2. Wymagania

  • przeglądarka, np. Chrome lub Firefox;
  • Projekt Google Cloud z włączonym rozliczeniem lub utwórz 90-dniowe konto próbne w Google Cloud Platform.
  • SAP GUI (Windows lub Java) zainstalowany w systemie. Jeśli SAP GUI jest już zainstalowany na laptopie, połącz się z SAP, używając zewnętrznego adresu IP maszyny wirtualnej jako adresu IP serwera aplikacji. Jeśli korzystasz z komputera Mac, możesz też zainstalować interfejs SAP GUI dla Javy, który jest dostępny pod tym linkiem.

3. Zanim zaczniesz

6757b2fb50ddcc2d.png

  • Aby uwierzytelnić się na koncie i ustawić domyślny projekt na abap-sdk-poc, uruchom w Cloud Shell te polecenia: Jako przykładu używamy strefy us-west4-b. W razie potrzeby zmień projekt i strefę w tych poleceniach zgodnie ze swoimi preferencjami.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Musisz mieć dostęp do systemu SAP z zainstalowanym pakietem ABAP SDK for Google Cloud.
  • Zanim przejdziesz do tego modułu, musisz ukończyć moduł 1 (Install ABAP Platform Trial 1909 on Google Cloud Platform and Install ABAP SDK for Google Cloud) i moduł 2 (Configure ABAP SDK Authentication using tokens for SAP Hosted on Compute Engine VM).
  • Jeśli masz już za sobą ćwiczenia 1 i 2, na Google Cloud powinien być już dostępny system ABAP Platform Trial 1909 wraz z wymaganą konfiguracją uwierzytelniania i łączności.
  • Jeśli nie ukończysz ćwiczeń 1 i 2, nie będziesz mieć całej wymaganej infrastruktury i połączeń, aby wykonać czynności opisane w tym ćwiczeniu. Dlatego przed rozpoczęciem tego ćwiczenia musisz ukończyć ćwiczenie 1 i ćwiczenie 2.

4. Włączanie BigQuery API V2 w projekcie Google Cloud

  1. W prawym górnym rogu Cloud Console kliknij Aktywuj Cloud Shell:

6757b2fb50ddcc2d.png

  1. Aby włączyć interfejs BigQuery API, uruchom w Cloud Shell te polecenia:
gcloud services enable bigquery.googleapis.com

Po pomyślnym wykonaniu polecenia powinien wyświetlić się komunikat podobny do tego poniżej.

b5f52859df2c2f56.png

Interfejs BigQuery API powinien być teraz włączony w projekcie Google Cloud.

5. Tworzenie konta usługi na potrzeby bezpiecznego dostępu do BigQuery

Aby bezpiecznie uzyskiwać prognozy systemów uczących się z modelu BigQuery ML, musisz utworzyć konto usługi z rolami Użytkownik zadań BigQueryWyświetlający dane BigQuery, które umożliwią programowi uruchamianie zapytań (jako zadań) w projekcie i odczytywanie danych z tabel. Ta rola przyznaje tylko uprawnienia niezbędne do tworzenia zadań i odczytywania danych, co minimalizuje ryzyko związane z bezpieczeństwem.

utworzyć konto usługi,

Aby utworzyć konto usługi z wymaganą rolą, wykonaj te czynności:

  1. Uruchom w terminalu Cloud Shell to polecenie:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Teraz dodaj wymagane role do konta usługi utworzonego w poprzednim kroku:
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'

W powyższym poleceniu abap-sdk-poc jest symbolem zastępczym projektu Google Cloud. Zastąp abap-sdk-poc identyfikatorem projektu.

  1. Aby sprawdzić, czy rola została dodana, otwórz stronę IAM. Utworzone konto usługi powinno być widoczne wraz z przypisaną do niego rolą.

6. Tworzenie modelu uczenia maszynowego w BigQuery

W tym ćwiczeniu utworzymy model k-średnich do klastrowania zbioru danych dotyczących wypożyczeń rowerów w Londynie. Możesz zastosować algorytm k-średnich, aby pogrupować dane w klastry. W przeciwieństwie do nadzorowanego uczenia maszynowego, które służy do analizy predykcyjnej, uczenie nienadzorowane służy do analizy opisowej. Chodzi o zrozumienie danych, aby móc podejmować decyzje na ich podstawie.

Tworzenie zbioru danych

Aby utworzyć zbiór danych BigQuery do przechowywania modelu ML, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę BigQuery. Otwórz stronę BigQuery
  2. W panelu Eksplorator kliknij nazwę projektu.
  3. Kliknij 5cf3b742649f1e2c.png Wyświetl działania > Utwórz zbiór danych.

3fbc072041bfa313.png

  1. Na stronie Utwórz zbiór danych wykonaj te czynności:
  • W polu Identyfikator zbioru danych wpisz bqml_tutorial.
  • Jako Typ lokalizacji wybierz Wiele regionów, a następnie EU (wiele regionów w Unii Europejskiej). Publiczny zbiór danych London Bicycle Hires jest przechowywany w wielu regionach w UE. Zbiór danych musi znajdować się w tej samej lokalizacji.
  • Pozostaw inne ustawienia domyślne bez zmian i kliknij Utwórz zbiór danych. Strona tworzenia zbioru danych.

Tworzenie modelu k-średnich

Po skonfigurowaniu zbioru danych następnym krokiem jest utworzenie na jego podstawie modelu k-średnich. Model k-średnich możesz utworzyć i wytrenować za pomocą instrukcji CREATE MODEL z opcją model_type=kmeans.

Aby uruchomić zapytanie i utworzyć model k-średnich, wykonaj te czynności:

  1. Otwórz stronę BigQuery. Otwórz BigQuery
  2. W panelu edytora uruchom to zapytanie 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. W panelu nawigacyjnym w sekcji Zasoby rozwiń nazwę projektu, kliknij bqml_tutorial, a następnie london_station_clusters.
  2. Kliknij kartę Schemat. Schemat modelu zawiera listę 3 atrybutów stacji, których BigQuery ML użyło do przeprowadzenia klastrowania. Schemat powinien wyglądać tak:

5f1feb313bd0f6a5.png

  1. Kliknij kartę Ocena. Ta karta zawiera wizualizacje klastrów zidentyfikowanych przez model k-średnich. W sekcji Funkcje liczbowe wykresy słupkowe wyświetlają maksymalnie 10 najważniejszych wartości funkcji liczbowych dla każdego centroidu. W menu możesz wybrać funkcje, które chcesz wizualizować.

8f9b53971e33dc08.png

7. Uzyskiwanie prognoz BigQuery ML za pomocą ABAP SDK for Google Cloud

Po skonfigurowaniu wymagań wstępnych w Google Cloud możesz wykonać czynności w systemie SAP, aby uzyskiwać prognozy z modelu ML za pomocą pakietu ABAP SDK for Google Cloud.

Tworzenie konfiguracji klucza klienta

W przypadku konfiguracji związanej z uwierzytelnianiem i łącznością pakiet ABAP SDK for Google Cloud korzysta z tabel /GOOG/CLIENT_KEY i /GOOG/SERVIC_MAP..

Aby zachować konfigurację w tabeli /GOOG/CLIENT_KEY, wykonaj te czynności:

  1. W SAP GUI wpisz kod transakcji SPRO.
  2. Kliknij SAP Reference IMG (SAP Reference IMG).
  3. Kliknij ABAP SDK for Google Cloud > Ustawienia podstawowe > Skonfiguruj klucz klienta.

25871e639293b9ee.png

  1. W przypadku wymienionych poniżej pól zachowaj podane wartości, a wszystkie pozostałe pola pozostaw puste:

Pole

Wartość

Nazwa klucza Google Cloud

BIGQUERY_ML

Nazwa konta usługi Google Cloud

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

Zakres Google Cloud

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

Identyfikator projektu

abap-sdk-poc

Klasa autoryzacji

/GOOG/CL_AUTH_GOOGLE

Tworzenie raportu ABAP w celu uzyskiwania prognoz z modelu BigQuery ML

Aby utworzyć raport ABAP, wykonaj te czynności:

  1. W SAP GUI otwórz kod transakcji SE38 i utwórz program raportu o nazwie ZDEMO_BIGQUERY_ML_PREDICT..
  2. W wyskakującym okienku podaj szczegóły zgodnie z tym, co widać na poniższym obrazie:

4cb32d50427df294.png

  1. W następnym wyskakującym okienku wybierz Local Object (Obiekt lokalny) lub podaj nazwę pakietu.
  2. W edytorze ABAP dodaj ten kod:
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. Zapisz i aktywuj raport.
  2. Wykonaj raport (F8).

Po pomyślnym wykonaniu powinien się wyświetlić raport podobny do tego:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Gratulacje

Świetna robota! Ukończono ćwiczenie „Uzyskiwanie prognoz z modelu uczenia maszynowego BigQuery za pomocą pakietu ABAP SDK dla Google Cloud”.

Udało Ci się pobrać prognozy modelu systemów uczących się BigQuery bezpośrednio z systemu SAP. Osiągnięto nowy poziom integracji między ABAP a usługami Google Cloud. Poszerz swoje horyzonty dzięki innym ciekawym ćwiczeniom z ABAP SDK for Google Cloud:

  • Korzystanie z interfejsu Translation API za pomocą pakietu ABAP SDK for Google Cloud
  • Przesyłanie dużego obiektu do zasobnika Cloud Storage przy użyciu dzielenia na części
  • Pobieranie danych logowania/obiektów tajnych z usługi Secret Manager za pomocą pakietu ABAP SDK for Google Cloud
  • Wywoływanie funkcji test-bison w Vertex AI z ABAP

9. Czyszczenie danych

Jeśli nie chcesz kontynuować pracy z dodatkowymi ćwiczeniami dotyczącymi pakietu ABAP SDK do Google Cloud, przejdź do sekcji czyszczenia.

Usuwanie projektu

  • Usuń projekt Google Cloud:
gcloud projects delete abap-sdk-poc

Usuwanie poszczególnych zasobów

  1. Usuń instancję obliczeniową:
gcloud compute instances delete abap-trial-docker
  1. Usuń reguły zapory sieciowej:
gcloud compute firewall-rules delete sapmachine
  1. Usuń konto usługi:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com