Чтение прогнозов BigQuery ML в SAP с помощью ABAP SDK для Google Cloud

1. Введение

В этой лаборатории кода вы создадите модель машинного обучения (ML) в BigQuery и получите прогнозы на основе этой модели с помощью ABAP SDK для Google Cloud .

Вы будете использовать следующие сервисы Google Cloud:

  • Большой запрос
  • Облачная оболочка

Что ты построишь

Вы создадите следующее:

  • Модель машинного обучения (ML) BigQuery.
  • Сервисный аккаунт с ролью пользователя задания BigQuery для вызова API BigQuery.
  • Программа ABAP для вызова BigQuery API и получения прогнозов из модели ML.

2. Требования

  • Браузер, например Chrome или Firefox .
  • Проект Google Cloud с включенной оплатой или создайте 90-дневную бесплатную пробную учетную запись для Google Cloud Platform.
  • SAP GUI (Windows или Java), установленный в вашей системе. Если графический интерфейс SAP уже установлен на вашем ноутбуке, подключитесь к SAP, используя внешний IP-адрес виртуальной машины в качестве IP-адреса сервера приложений. Если вы используете Mac, вы также можете установить графический интерфейс SAP для Java, доступный по этой ссылке.

3. Прежде чем начать

6757b2fb50ddcc2d.png

  • Выполните следующие команды в Cloud Shell, чтобы пройти аутентификацию для своей учетной записи, и установите проект по умолчанию abap-sdk-poc . В качестве примера используется зона us-west4-b . При необходимости измените проект и зону с помощью следующих команд в соответствии с вашими предпочтениями.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • У вас должен быть доступ к системе SAP с установленным ABAP SDK для Google Cloud.
  • Прежде чем приступить к этой лаборатории кода, необходимо выполнить лабораторную работу 1 ( Установить пробную версию платформы ABAP 1909 на Google Cloud Platform и установить ABAP SDK для Google Cloud) и лабораторную работу 2 ( Настроить аутентификацию ABAP SDK с использованием токенов для SAP, размещенного на виртуальной машине Compute Engine ).
  • Если вы завершили Codelab 1 и Codelab 2, это предоставит вам пробную систему ABAP Platform Trial 1909 в Google Cloud, а также необходимые настройки для аутентификации и подключения.
  • Если вы не завершили Лабораторию кода 1 и Лабораторию кода 2, у вас не будет всей необходимой инфраструктуры и возможностей подключения для выполнения шагов, описанных в этой лаборатории кода. Таким образом, вы должны завершить кодовую таблицу 1 и кодовую таблицу 2, прежде чем приступать к этой кодовой таблице.

4. Включите BigQuery API V2 в своем проекте Google Cloud.

  1. В Cloud Console нажмите «Активировать Cloud Shell» в правом верхнем углу:

6757b2fb50ddcc2d.png

  1. Выполните следующие команды в Cloud Shell, чтобы включить BigQuery API:
gcloud services enable bigquery.googleapis.com

При успешном выполнении вы должны увидеть сообщение, как показано ниже.

b5f52859df2c2f56.png

Теперь в вашем проекте Google Cloud должен быть включен BigQuery API.

5. Создайте сервисную учетную запись для безопасного доступа к BigQuery.

Чтобы безопасно получать прогнозы ML из модели BigQuery ML, вам необходимо создать сервисную учетную запись с ролями «Пользователь задания BigQuery» и «Просмотр данных BigQuery» , которая позволит вашей программе выполнять запросы (как задания) внутри проекта и считывать данные из таблиц. Эта роль предоставляет только необходимые разрешения на создание заданий и чтение данных, что сводит к минимуму риски безопасности.

Создать учетную запись службы

Чтобы создать сервисную учетную запись с необходимой ролью, выполните следующие действия:

  1. Выполните следующую команду в терминале Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Теперь добавьте необходимые роли в сервисную учетную запись, созданную на предыдущем шаге:
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'

Приведенная выше команда использует abap-sdk-poc в качестве заполнителя для проекта Google Cloud. Замените abap-sdk-poc на идентификатор вашего проекта.

  1. Чтобы убедиться, что роль добавлена, перейдите на страницу IAM . Созданная вами учетная запись службы должна быть указана вместе с назначенной ей ролью.

6. Создание модели машинного обучения BigQuery.

В этой кодовой лаборатории мы создадим модель k-средних для кластеризации набора данных о прокате велосипедов в Лондоне. Вы можете применить алгоритм k-средних для группировки данных в кластеры. В отличие от машинного обучения с учителем, которое связано с прогнозной аналитикой, обучение без учителя связано с описательной аналитикой. Речь идет о понимании ваших данных, чтобы вы могли принимать решения на основе данных.

Создайте свой набор данных

Чтобы создать набор данных BigQuery для хранения модели машинного обучения, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу BigQuery. Перейти на страницу BigQuery
  2. На панели «Проводник» щелкните имя проекта.
  3. Нажмите 5cf3b742649f1e2c.png Просмотр действий > Создать набор данных .

3fbc072041bfa313.png

  1. На странице Создать набор данных выполните следующие действия:
  • В качестве идентификатора набора данных введите bqml_tutorial .
  • В поле «Тип местоположения» выберите «Мультирегион» , а затем выберите «ЕС» (несколько регионов в Европейском Союзе) . Публичный набор данных London Bicycle Hires хранится в нескольких регионах ЕС. Ваш набор данных должен находиться в том же месте.
  • Остальные настройки по умолчанию оставьте без изменений и нажмите « Создать набор данных» . Создать страницу набора данных.

Создайте модель k-средних

Теперь, когда ваш набор данных настроен, следующим шагом будет создание модели k-средних с использованием данных. Вы можете создать и обучить модель k-средних, используя оператор CREATE MODEL с опцией model_type=kmeans .

Чтобы запустить запрос и создать модель k-средних, выполните следующие шаги:

  1. Перейдите на страницу BigQuery . Перейти в BigQuery
  2. На панели редактора выполните следующий оператор 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. На панели навигации в разделе «Ресурсы» разверните имя проекта, щелкните bqml_tutorial , а затем щелкните london_station_clusters .
  2. Откройте вкладку «Схема» . В схеме модели перечислены три атрибута станции, которые BigQuery ML использовал для выполнения кластеризации. Схема должна выглядеть следующим образом:

5f1feb313bd0f6a5.png

  1. Откройте вкладку «Оценка» . На этой вкладке отображаются визуализации кластеров, идентифицированных моделью k-средних. В разделе «Числовые функции» гистограммы отображают до 10 наиболее важных числовых значений функций для каждого центроида. Вы можете выбрать, какие функции визуализировать, из раскрывающегося меню.

8f9b53971e33dc08.png

7. Получайте прогнозы BigQuery ML с помощью ABAP SDK для Google Cloud.

Теперь, когда вы настроили предварительные условия на стороне Google Cloud, вы готовы выполнить шаги в своей системе SAP, чтобы получить прогнозы из модели ML с помощью ABAP SDK для Google Cloud.

Создание конфигурации ключа клиента

Для конфигурации, связанной с аутентификацией и подключением, ABAP SDK для Google Cloud использует таблицы /GOOG/CLIENT_KEY и /GOOG/SERVIC_MAP.

Чтобы сохранить конфигурацию в таблице /GOOG/CLIENT_KEY , выполните следующие действия:

  1. В графическом интерфейсе SAP введите код транзакции SPRO .
  2. Щелкните Справочное IMG SAP .
  3. Нажмите ABAP SDK для Google Cloud > Основные настройки > Настроить ключ клиента.

25871e639293b9ee.png

  1. Сохраните следующие значения в перечисленных полях, все остальные поля оставьте пустыми:

Поле

Ценить

Имя облачного ключа Google

BIGQUERY_ML

Имя учетной записи облачной службы Google

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

Облачная область Google

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

Идентификатор проекта

abap-sdk-poc

Класс авторизации

/GOOG/CL_AUTH_GOOGLE

Создайте отчет ABAP, чтобы получать прогнозы на основе модели BigQuery ML.

Чтобы построить отчет ABAP, выполните следующие действия:

  1. В графическом интерфейсе SAP перейдите к коду транзакции SE38 и создайте программу отчетов с именем ZDEMO_BIGQUERY_ML_PREDICT.
  2. В открывшемся всплывающем окне укажите детали, как показано на следующем изображении:

4cb32d50427df294.png

  1. В следующем всплывающем окне выберите «Локальный объект» или укажите имя пакета, если это необходимо.
  2. В редакторе ABAP добавьте следующий код:
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. Сохраните и активируйте отчет.
  2. Выполнить отчет (F8).

В случае успешного выполнения вы должны увидеть вывод отчета, как показано ниже:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Поздравления

Отличная работа по завершению кодовой лаборатории «Получение прогнозов из модели машинного обучения (ML) BigQuery с использованием ABAP SDK для Google Cloud»!

Вы успешно получили прогнозы модели машинного обучения BigQuery прямо из своей системы SAP! Вы открыли новый уровень интеграции между ABAP и облачными сервисами Google. Расширьте свой кругозор с помощью других интересных лабораторий кода ABAP SDK для Google Cloud:

  • Использование API перевода с ABAP SDK для Google Cloud
  • Загрузите большой объект в корзину Cloud Storage, используя фрагментирование.
  • Получение учетных данных/секретов из Secret Manager с помощью ABAP SDK для Google Cloud
  • Вызов Vertex AI test-bison из ABAP

9. Очистка

Если вы не хотите продолжать работу с дополнительными лабораториями кода, связанными с ABAP SDK для Google Cloud, продолжите очистку.

Удалить проект

  • Удалите проект Google Cloud:
gcloud projects delete abap-sdk-poc

Удаление отдельных ресурсов

  1. Удалите вычислительный экземпляр:
gcloud compute instances delete abap-trial-docker
  1. Удалите правила брандмауэра:
gcloud compute firewall-rules delete sapmachine
  1. Удалить сервисный аккаунт:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com