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

1. Wprowadzenie

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

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

  • BigQuery
  • Cloud Shell

Co utworzysz

Utworzysz:

  • Model uczenia maszynowego w BigQuery.
  • 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ć SAP GUI for Java, 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 ćwiczenia, musisz wykonać ćwiczenie 1 (Instalowanie wersji próbnej platformy ABAP 1909 w Google Cloud Platform i pakietu ABAP SDK for Google Cloud) i ćwiczenie 2 (Konfigurowanie uwierzytelniania za pomocą pakietu ABAP SDK przy użyciu tokenów dla systemu SAP hostowanego w maszynie wirtualnej Compute Engine).
  • Jeśli masz za sobą ćwiczenia 1 i 2, powinna być już dla Ciebie dostępna wersja próbna platformy ABAP 1909 w Google Cloud 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 konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu:

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 uczenia maszynowego z modelu BigQuery ML, musisz utworzyć konto usługi z rolami Użytkownik zadań BigQuery i Wyświetlający dane BigQuery, które umożliwią programowi uruchamianie zapytań (jako zadań) w projekcie i odczytywanie danych z tabel. Ta rola przyznaje tylko niezbędne uprawnienia 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ę Uprawnienia. 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 podstawie tych danych 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 następującą instrukcję 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 użytkownika 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. Pobieranie prognoz BigQuery ML przy użyciu pakietu ABAP SDK for Google Cloud

Po skonfigurowaniu wymagań wstępnych po stronie Google Cloud możesz wykonać czynności w systemie SAP, aby uzyskać prognozy z modelu uczenia maszynowego przy użyciu 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 informacjami na tym 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.png6405542a597ed09f.png

8. Gratulacje

Świetna robota! Ćwiczenie „Uzyskiwanie prognoz z modelu uczenia maszynowego w BigQuery za pomocą pakietu ABAP SDK for Google Cloud” zostało ukończone.

Udało Ci się pobrać prognozy modelu uczenia maszynowego w BigQuery bezpośrednio z systemu SAP. Osiągnięto nowy poziom integracji między ABAP a usługami Google Cloud. Poszerz horyzonty dzięki innym ciekawym ćwiczeniom dotyczącym pakietu 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 z użyciem fragmentowania
  • Pobieranie danych logowania i obiektów tajnych z usługi Secret Manager za pomocą pakietu ABAP SDK for Google Cloud
  • Wywoływanie test-bison w Vertex AI z ABAP

9. Czyszczenie danych

Jeśli nie chcesz kontynuować pracy z dodatkowymi ćwiczeniami związanymi z pakietem ABAP SDK for 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