קריאת חיזויים של BigQuery ML ב-SAP באמצעות ABAP SDK ל-Google Cloud

1. מבוא

ב-Codelab הזה תיצרו מודל של למידת מכונה (ML) ב-BigQuery ותקבלו חיזויים מהמודל הזה באמצעות ABAP SDK ל-Google Cloud.

תשתמשו בשירותי Google Cloud הבאים:

  • BigQuery
  • Cloud Shell

מה תפַתחו

ייווצרו הפריטים הבאים:

  • מודל למידת מכונה (ML) ב-BigQuery.
  • חשבון שירות עם תפקיד BigQuery Job User לקריאה ל-BigQuery API.
  • תוכנית ABAP לשליחת קריאה ל-BigQuery API ולקבל חיזויים ממודל למידת המכונה.

2. דרישות

  • דפדפן כמו Chrome או Firefox.
  • פרויקט ב-Google Cloud שהחיוב בו מופעל או יצירת חשבון לתקופת ניסיון בחינם למשך 90 יום ל-Google Cloud Platform.
  • SAP GUI (Windows או Java) מותקן במערכת. אם SAP GUI כבר מותקן במחשב הנייד שלכם, מתחברים ל-SAP באמצעות כתובת ה-IP החיצונית של VM בתור כתובת ה-IP של שרת האפליקציות. אם אתם משתמשים ב-Mac, תוכלו גם להתקין את SAP GUI ל-Java שזמין בקישור הזה.

3. לפני שמתחילים

6757b2fb50ddcc2d.png

  • כדי לאמת את החשבון ולהגדיר את פרויקט ברירת המחדל ל-abap-sdk-poc, מריצים את הפקודות הבאות ב-Cloud Shell. התחום 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.
  • לפני שממשיכים ב-Codelab הזה, צריך להשלים את Codelab 1 (התקנת גרסת ניסיון 1909 של ABAP Platform ב-Google Cloud Platform והתקנת ABAP SDK ל-Google Cloud) ו-Codelab 2 (הגדרת אימות ABAP SDK באמצעות אסימונים ל-SAP שמתארח ב-VM של Compute Engine).
  • אם השלמתם את Codelab 1 ואת Codelab 2, הייתה מוקצית לך מערכת ABAP Platform ממשלתית 1909 לניסיון ב-Google Cloud, יחד עם ההגדרה הדרושה לאימות ולקישוריות.
  • אם לא השלמתם את Codelab 1 ואת Codelab 2, לא יהיו לכם כל התשתית והקישוריות הנדרשים לביצוע השלבים המפורטים ב-Codelab הזה. לכן לפני שממשיכים ב-Codelab הזה צריך להשלים את Codelab 1 ואת Codelab 2.

4. הפעלת BigQuery API V2 בפרויקט Google Cloud

  1. לוחצים על Activate Cloud Shell בפינה הימנית העליונה ב-Cloud Console:

6757b2fb50ddcc2d.png

  1. כדי להפעיל את BigQuery API, מריצים את הפקודות הבאות ב-Cloud Shell:
gcloud services enable bigquery.googleapis.com

כשהביצוע יסתיים בהצלחה, אמורה להופיע הודעה שמוצגת בהמשך

b5f52859df2c2f56.png

עכשיו BigQuery API אמור להיות מופעל בפרויקט שלכם ב-Google Cloud.

5. יצירת חשבון שירות לגישה מאובטחת ל-BigQuery

כדי לקבל באופן מאובטח חיזויים של למידת מכונה ממודל של 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 כ-placeholder של הפרויקט ב-Google Cloud. מחליפים את abap-sdk-poc במזהה הפרויקט.

  1. כדי לוודא שהתפקיד נוסף, צריך להיכנס לדף IAM. חשבון השירות שיצרתם צריך להיות רשום לצד התפקיד שהוקצה לו.

6. יצירת מודל למידת מכונה ב-BigQuery

ב-Codelab הזה, ניצור מודל k-mean לקיבוץ מערך הנתונים של השכרת אופניים בלונדון. תוכלו להחיל את האלגוריתם k-means כדי לקבץ את הנתונים באשכולות. בניגוד ללמידת מכונה בפיקוח, שעוסקת בניתוח נתונים חזוי, למידה בלתי מונחית קשורה לניתוח תיאורי. המטרה היא להבין את הנתונים שלכם כדי שתוכלו לקבל החלטות שמבוססות על נתונים.

יצירת מערך הנתונים

כדי ליצור מערך נתונים ב-BigQuery לאחסון מודל למידת מכונה, מבצעים את השלבים הבאים:

  1. נכנסים לדף ב-BigQuery במסוף Google Cloud. כניסה לדף BigQuery
  2. בחלונית Explorer לוחצים על שם הפרויקט.
  3. לוחצים על 5cf3b742649f1e2c.png הצגת פעולות > יצירת מערך נתונים.

3fbc072041bfa313.png

  1. בדף Create dataset מבצעים את הפעולות הבאות:
  • בשדה Dataset ID, מזינים bqml_tutorial.
  • בקטע Location type (סוג המיקום), בוחרים באפשרות Multi-region (מספר אזורים) ואז בוחרים EU (מספר אזורים באיחוד האירופי). מערך הנתונים הציבורי של London bike hires מאוחסן במספר אזורים באיחוד האירופי. מערך הנתונים חייב להיות באותו מיקום.
  • משאירים את שאר הגדרות ברירת המחדל כפי שהן ולוחצים על Create dataset. דף יצירת מערך נתונים.

יצירת מודל k-כלומר

אחרי שהגדרתם את מערך הנתונים, השלב הבא הוא ליצור מודל k-means באמצעות הנתונים. אפשר ליצור ולאמן מודל k באמצעות ההצהרה CREATE MODEL עם האפשרות model_type=kmeans.

כדי להריץ את השאילתה וליצור מודל 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. בחלונית הניווט, בקטע Resources, מרחיבים את שם הפרויקט, לוחצים על bqml_tutorial ואז על london_station_clusters.
  2. לוחצים על הכרטיסייה Schema. סכימת המודלים מפרטת את שלושת המאפיינים של התחנות שבהם נעשה שימוש ב-BigQuery ML לביצוע אשכולות. הסכימה אמורה להיראות כך:

5f1feb313bd0f6a5.png

  1. לוחצים על הכרטיסייה הערכה. בכרטיסייה הזו מוצגות תצוגות חזותיות של האשכולות שזוהו על ידי מודל ה-K. בקטע תכונות מספריות, תרשימי עמודות מציגים עד 10 מהערכים של התכונות המספריות החשובות ביותר לכל מרכז. בתפריט הנפתח אפשר לבחור את התכונות שרוצים להציג.

8f9b53971e33dc08.png

7. קבלת חיזויים של BigQuery ML באמצעות 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 GUI, מזינים את קוד העסקה SPRO.
  2. לוחצים על SAP Reference JPG.
  3. לוחצים על ABAP SDK for 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. ב-GUI של 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' codelab!

אחזור בהצלחה חיזויים של מודל למידת מכונה של BigQuery, ישירות מתוך מערכת SAP שלך! קיבלת גישה לרמה חדשה של שילוב בין ABAP לשירותי Google Cloud. מרחיבים את האופקים עם עוד SDK מלהיב של ABAP ל-Google Cloud Codelabs:

  • שימוש ב-Translation API עם ABAP SDK ל-Google Cloud
  • העלאת אובייקט גדול לקטגוריה של Cloud Storage באמצעות מקטע נתונים
  • אחזור של פרטי כניסה או סודות מ-Secret Manager באמצעות ABAP SDK ל-Google Cloud
  • ביצוע שיחה של Vertex AI לבדיקה מ-ABAP

9. הסרת המשאבים

לא רוצה להמשיך עם ה-Codelabs הנוספים שקשורים ל-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