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

1. Введение

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

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

  • BigQuery
  • Облачная оболочка

Что вы построите

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

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

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

  • Браузер, например Chrome или Firefox .
  • Проект Google Cloud с включенной оплатой или создайте 90-дневную бесплатную пробную учетную запись для Google Cloud Platform.
  • SAP GUI (Windows или Java) должен быть установлен в вашей системе. Если SAP GUI уже установлен на вашем ноутбуке, подключитесь к SAP, используя внешний IP-адрес виртуальной машины в качестве IP-адреса сервера приложений. Если вы используете Mac, вы также можете установить SAP GUI для 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 и установка ABAP SDK для Google Cloud) и практическое задание 2 ( Настройка аутентификации ABAP SDK с использованием токенов для SAP, размещенного на виртуальной машине Compute Engine ).
  • Если вы выполнили практическое задание 1 и практическое задание 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. Для включения API BigQuery выполните следующие команды в Cloud Shell:
gcloud services enable bigquery.googleapis.com

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

b5f52859df2c2f56.png

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

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

Для безопасного получения прогнозов машинного обучения от модели BigQuery необходимо создать учетную запись службы с ролями « Пользователь заданий 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 с помощью ABAP SDK для Google Cloud.

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

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

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

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

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

25871e639293b9ee.png

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

Поле

Ценить

Ключевое имя Google Cloud

BIGQUERY_ML

Имя учетной записи сервиса Google Cloud

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

Область применения Google Cloud

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

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

abap-sdk-poc

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

/GOOG/CL_AUTH_GOOGLE

Создайте ABAP-отчет для получения прогнозов от модели машинного обучения BigQuery.

Для создания отчета ABAP выполните следующие шаги:

  1. В SAP GUI перейдите к транзакции 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.png6405542a597ed09f.png

8. Поздравляем!

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

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

  • Использование API перевода с ABAP SDK для Google Cloud
  • Загрузка большого объекта в хранилище Cloud Storage с использованием фрагментной обработки.
  • Получение учетных данных/секретов из менеджера секретов с помощью ABAP SDK для Google Cloud.
  • Вызов тестового бизона Vertex AI из 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