پیش‌بینی‌های BigQuery ML را در SAP با استفاده از ABAP SDK برای Google Cloud بخوانید

1. معرفی

در این لبه کد، یک مدل یادگیری ماشینی (ML) در BigQuery ایجاد می‌کنید و با استفاده از ABAP SDK برای Google Cloud، پیش‌بینی‌هایی از این مدل دریافت می‌کنید.

شما از خدمات Google Cloud زیر استفاده خواهید کرد:

  • BigQuery
  • پوسته ابری

چیزی که خواهی ساخت

شما موارد زیر را ایجاد خواهید کرد:

  • یک مدل یادگیری ماشینی BigQuery (ML).
  • یک حساب سرویس با نقش BigQuery Job User برای فراخوانی BigQuery API.
  • یک برنامه ABAP برای فراخوانی BigQuery API و دریافت پیش‌بینی از مدل ML.

2. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس .
  • یک پروژه Google Cloud با فعال کردن صورت‌حساب یا ایجاد یک حساب آزمایشی رایگان 90 روزه برای Google Cloud Platform.
  • SAP GUI (ویندوز یا جاوا) در سیستم شما نصب شده است. اگر SAP GUI قبلاً روی لپ‌تاپ شما نصب شده است، با استفاده از آدرس IP خارجی VM به عنوان IP سرور برنامه، به SAP متصل شوید. اگر در مک هستید، می توانید SAP GUI برای جاوا را نیز در این لینک نصب کنید.

3. قبل از شروع

6757b2fb50ddcc2d.png

  • دستورات زیر را در Cloud Shell برای احراز هویت برای حساب خود اجرا کنید و پروژه پیش فرض را روی abap-sdk-poc تنظیم کنید. Zone 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 Platform Trial 1909 در Google Cloud Platform و نصب ABAP SDK for Google Cloud) و codelab 2 ( پیکربندی احراز هویت ABAP SDK با استفاده از نشانه‌ها برای SAP Hosted on Compute Engine VM ) را تکمیل کنید.
  • اگر کد 1 و کد 2 را تکمیل کرده باشید، با این کار یک سیستم آزمایشی 1909 پلتفرم ABAP در Google Cloud به همراه تنظیمات لازم برای احراز هویت و اتصال را برای شما فراهم می کند.
  • اگر Codelab 1 و Codelab 2 را تکمیل نکرده باشید، تمامی زیرساخت ها و اتصالات لازم برای انجام مراحل ارائه شده در این کدلب را نخواهید داشت. بنابراین، قبل از ادامه کار با این کد، باید کد 1 و کد 2 را تکمیل کنید.

4. BigQuery API V2 را در پروژه Google Cloud خود فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell در گوشه سمت راست بالا کلیک کنید:

6757b2fb50ddcc2d.png

  1. برای فعال کردن BigQuery API دستورات زیر را در Cloud Shell اجرا کنید:
gcloud services enable bigquery.googleapis.com

در اجرای موفقیت آمیز باید پیامی را مشاهده کنید که مطابق شکل زیر نمایش داده می شود

b5f52859df2c2f56.png

اکنون باید BigQuery API را در پروژه Google Cloud خود فعال کنید.

5. یک حساب سرویس برای دسترسی ایمن BigQuery ایجاد کنید

برای دریافت ایمن پیش‌بینی‌های ML از یک مدل BigQuery ML، باید یک حساب سرویس با نقش‌های BigQuery Job User و BigQuery Data Viewer ایجاد کنید، که به برنامه شما اجازه می‌دهد تا کوئری‌ها (به عنوان شغل) را در پروژه اجرا کند و داده‌ها را از جداول بخواند. این نقش تنها مجوز لازم برای ایجاد شغل و خواندن داده ها را می دهد و خطرات امنیتی را به حداقل می رساند.

یک حساب کاربری ایجاد کنید

برای ایجاد یک حساب کاربری با نقش مورد نیاز، مراحل زیر را انجام دهید:

  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-means برای خوشه‌بندی مجموعه داده‌های اجاره دوچرخه لندن ایجاد می‌کنیم. می توانید از الگوریتم k-means برای گروه بندی داده های خود در خوشه ها استفاده کنید. برخلاف یادگیری ماشینی نظارت شده، که در مورد تجزیه و تحلیل پیش بینی کننده است، یادگیری بدون نظارت در مورد تجزیه و تحلیل توصیفی است. این در مورد درک داده های شما است تا بتوانید تصمیمات مبتنی بر داده را بگیرید.

مجموعه داده خود را ایجاد کنید

برای ایجاد یک مجموعه داده BigQuery برای ذخیره مدل ML خود، مراحل زیر را انجام دهید:

  1. در کنسول Google Cloud، به صفحه BigQuery بروید. به صفحه BigQuery بروید
  2. در پنجره Explorer ، روی نام پروژه خود کلیک کنید.
  3. کلیک 5cf3b742649f1e2c.png مشاهده کنش‌ها > ایجاد مجموعه داده .

3fbc072041bfa313.png

  1. در صفحه ایجاد مجموعه داده ، موارد زیر را انجام دهید:
  • برای شناسه مجموعه داده ، bqml_tutorial را وارد کنید.
  • برای نوع مکان ، Multi-region را انتخاب کنید و سپس EU (منطقه های متعدد در اتحادیه اروپا) را انتخاب کنید. مجموعه داده عمومی London Bicycle Hires در چند منطقه اتحادیه اروپا ذخیره می شود. مجموعه داده شما باید در همان مکان باشد.
  • تنظیمات پیش‌فرض باقیمانده را همانطور که هستند رها کنید و روی ایجاد مجموعه داده کلیک کنید. ایجاد صفحه مجموعه داده

یک مدل k-means ایجاد کنید

اکنون که مجموعه داده شما تنظیم شده است، گام بعدی ایجاد یک مدل k-means با استفاده از داده ها است. می توانید با استفاده از دستور CREATE MODEL با گزینه model_type=kmeans یک مدل k-means ایجاد و آموزش دهید.

برای اجرای کوئری و ایجاد مدل k-means مراحل زیر را انجام دهید:

  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. روی تب Schema کلیک کنید. طرح مدل، سه ویژگی ایستگاهی را که BigQuery ML برای انجام خوشه‌بندی استفاده کرد، فهرست می‌کند. طرحواره باید به شکل زیر باشد:

5f1feb313bd0f6a5.png

  1. روی تب Evaluation کلیک کنید. این برگه تجسم خوشه های شناسایی شده توسط مدل k-means را نمایش می دهد. در زیر ویژگی‌های عددی ، نمودارهای میله‌ای تا 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 GUI، کد تراکنش SPRO را وارد کنید.
  2. روی SAP Reference IMG کلیک کنید.
  3. روی ABAP SDK برای Google Cloud > Basic Settings > Configure Client Key کلیک کنید

25871e639293b9ee.png

  1. مقادیر زیر را در برابر فیلدهای فهرست شده حفظ کنید، تمام فیلدهای دیگر را خالی بگذارید:

رشته

ارزش

نام کلید Google Cloud

BIGQUERY_ML

نام حساب سرویس Google Cloud

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

Google Cloud Scope

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

شناسه پروژه

abap-sdk-poc

کلاس مجوز

/GOOG/CL_AUTH_GOOGLE

یک گزارش ABAP بسازید تا از مدل BigQuery ML پیش‌بینی کنید

برای ایجاد یک گزارش ABAP، مراحل زیر را انجام دهید:

  1. در SAP GUI خود، به کد تراکنش SE38 بروید و یک برنامه گزارش با نام ZDEMO_BIGQUERY_ML_PREDICT.
  2. در پاپ آپی که باز می شود، جزئیات را مانند تصویر زیر ارائه کنید:

4cb32d50427df294.png

  1. در پاپ آپ بعدی، یا Local Object را انتخاب کنید یا یک نام بسته را در صورت لزوم وارد کنید.
  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. تبریک می گویم

کار بسیار عالی برای تکمیل آزمایشگاه کد "دریافت پیش بینی ها از مدل BigQuery Machine Learning (ML) با استفاده از ABAP SDK for Google Cloud"!

شما با موفقیت پیش‌بینی‌های یک مدل یادگیری ماشین BigQuery را درست از درون سیستم SAP خود بازیابی کرده‌اید! سطح جدیدی از ادغام بین ABAP و Google Cloud Services را باز کرده اید. افق‌های خود را با سایر نرم‌افزارهای توسعه نرم‌افزار توسعه نرم‌افزار ABAP هیجان‌انگیز برای آزمایشگاه‌های کد Google Cloud گسترش دهید:

  • استفاده از Translation API با ABAP SDK برای Google Cloud
  • یک شی بزرگ را با استفاده از تکه کردن در یک سطل فضای ذخیره سازی ابری آپلود کنید
  • بازیابی اعتبارنامه/اسرار از 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