1. מבוא
ב-Codelab הזה נסביר איך ליצור מודל למידת מכונה (ML) ב-BigQuery ולקבל חיזויים מהמודל הזה באמצעות ABAP SDK for Google Cloud.
תשתמשו בשירותים הבאים של Google Cloud:
- BigQuery
- Cloud Shell
מה תפַתחו
תצטרכו ליצור את הפריטים הבאים:
- מודל למידת מכונה (ML) של BigQuery.
- חשבון שירות עם התפקיד BigQuery Job User (משתמש במשימות BigQuery) כדי לקרוא ל-BigQuery API.
- תוכנית ABAP לקריאה ל-BigQuery API ולקבלת חיזויים ממודל ה-ML.
2. דרישות
- דפדפן, כמו Chrome או Firefox.
- פרויקט ב-Google Cloud עם חיוב מופעל או יצירת חשבון לניסיון חינם למשך 90 יום ב-Google Cloud Platform.
- SAP GUI (Windows או Java) מותקן במערכת. אם SAP GUI כבר מותקן במחשב הנייד, מתחברים ל-SAP באמצעות כתובת ה-IP החיצונית של המכונה הווירטואלית ככתובת ה-IP של שרת האפליקציות. אם אתם משתמשים ב-Mac, אתם יכולים גם להתקין את SAP GUI for Java שזמין בקישור הזה.
3. לפני שמתחילים
- ב-מסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-Google Cloud (לדוגמה:
abap-sdk-poc). - הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט אפשר לדלג על השלב הזה אם אתם משתמשים בחשבון לתקופת ניסיון בחינם ל-90 ימים.
- תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.
- בפינה הימנית העליונה של Cloud Console, לוחצים על Activate Cloud Shell (הפעלת Cloud Shell):

- מריצים את הפקודות הבאות ב-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 for Google Cloud מותקן.
- לפני שממשיכים עם שיעור Codelab הזה, צריך להשלים את שיעור Codelab מספר 1 (Install ABAP Platform Trial 1909 on Google Cloud Platform and Install ABAP SDK for Google Cloud) ואת שיעור Codelab מספר 2 (Configure ABAP SDK Authentication using tokens for SAP Hosted on Compute Engine VM).
- אם השלמתם את שיעור Codelab 1 ואת שיעור Codelab 2, הוקצה לכם ניסיון חינם של ABAP Platform 1909 System ב-Google Cloud, יחד עם ההגדרה הנדרשת לאימות ולקישוריות.
- אם לא השלמתם את Codelab 1 ו-Codelab 2, לא תהיה לכם את כל התשתית והקישוריות הנדרשות כדי לבצע את השלבים שמופיעים ב-Codelab הזה. לכן, צריך להשלים את Codelab 1 ואת Codelab 2 לפני שממשיכים עם ה-Codelab הזה.
4. הפעלת BigQuery API V2 בפרויקט Google Cloud
- בפינה הימנית העליונה של Cloud Console, לוחצים על Activate Cloud Shell (הפעלת Cloud Shell):

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

מעכשיו, BigQuery API מופעל בפרויקט Google Cloud.
5. יצירת חשבון שירות לגישה מאובטחת ל-BigQuery
כדי לקבל תחזיות ML ממודל BigQuery ML בצורה מאובטחת, צריך ליצור חשבון שירות עם התפקידים BigQuery Job User ו-BigQuery Data Viewer. התפקידים האלה יאפשרו לתוכנית להריץ שאילתות (כמשימות) בתוך הפרויקט ולקרוא נתונים מטבלאות. התפקיד הזה מעניק רק את ההרשאה הנדרשת ליצירת משימות ולקריאת נתונים, וכך מצמצם את הסיכונים לאבטחה.
יצירה של חשבון שירות
כדי ליצור חשבון שירות עם התפקיד הנדרש, מבצעים את השלבים הבאים:
- מריצים את הפקודה הבאה במסוף Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
- עכשיו מוסיפים לחשבון השירות שנוצר בשלב הקודם את התפקידים הנדרשים:
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 במזהה הפרויקט.
- כדי לוודא שהתפקיד נוסף, עוברים לדף IAM. חשבון השירות שיצרתם אמור להופיע ברשימה יחד עם התפקיד שהוקצה לו.
6. יצירת מודל של למידת מכונה ב-BigQuery
בשיעור Codelab הזה ניצור מודל k-means כדי לבצע אשכולות במערך הנתונים של השכרת אופניים בלונדון. אתם יכולים להחיל את אלגוריתם k-means כדי לקבץ את הנתונים לאשכולות. בניגוד ללמידת מכונה מפוקחת, שמתמקדת בניתוח נתונים לחיזוי, למידה לא מפוקחת מתמקדת בניתוח נתונים תיאורי. הכוונה היא להבין את הנתונים כדי לקבל החלטות שמבוססות על נתונים.
יצירת מערך נתונים
כדי ליצור מערך נתונים ב-BigQuery לאחסון מודל למידת המכונה, פועלים לפי השלבים הבאים:
- במסוף Google Cloud, עוברים לדף BigQuery. לדף BigQuery
- בחלונית Explorer, לוחצים על שם הפרויקט.
- לוחצים על
הצגת פעולות > יצירת מערך נתונים.

- בדף Create dataset, מבצעים את הפעולות הבאות:
- בשדה Dataset ID (מזהה קבוצת נתונים), מזינים
bqml_tutorial. - בקטע Location type (סוג המיקום), בוחרים באפשרות Multi-region (מספר אזורים) ואז באפשרות EU (multiple regions in European Union) (האיחוד האירופי (מספר אזורים באיחוד האירופי)). מערך הנתונים הציבורי London Bicycle Hires מאוחסן במספר אזורים באיחוד האירופי. מערך הנתונים צריך להיות באותו מיקום.
- משאירים את הגדרות ברירת המחדל שנותרו כמו שהן ולוחצים על Create dataset (יצירת מערך נתונים).

יצירת מודל k-means
אחרי שמגדירים את מערך הנתונים, השלב הבא הוא ליצור מודל k-means באמצעות הנתונים. אפשר ליצור ולאמן מודל k-means באמצעות ההצהרה CREATE MODEL עם האפשרות model_type=kmeans.
כדי להריץ את השאילתה וליצור מודל k-means, מבצעים את השלבים הבאים:
- עוברים לדף BigQuery. כניסה ל-BigQuery
- בחלונית העריכה, מריצים את הצהרת ה-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
- בחלונית הניווט, בקטע משאבים, מרחיבים את שם הפרויקט, לוחצים על bqml_tutorial ואז על london_station_clusters.
- לוחצים על הכרטיסייה סכימה. בסכימת המודל מפורטים שלושת מאפייני התחנה שבהם נעשה שימוש ב-BigQuery ML כדי לבצע אשכולות. הסכימה צריכה להיראות כך:

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

7. קבלת חיזויים של BigQuery ML באמצעות ABAP SDK for Google Cloud
אחרי שהגדרתם את הדרישות המוקדמות בצד של Google Cloud, אתם מוכנים לבצע את השלבים במערכת SAP כדי לקבל חיזויים ממודל ה-ML באמצעות ABAP SDK for Google Cloud.
יצירת הגדרה של מפתח לקוח
לצורך הגדרה שקשורה לאימות ולקישוריות, ABAP SDK for Google Cloud משתמש בטבלאות /GOOG/CLIENT_KEY ו-/GOOG/SERVIC_MAP.
כדי לשמור את ההגדרה בטבלה /GOOG/CLIENT_KEY, מבצעים את השלבים הבאים:
- ב-SAP GUI, מזינים את קוד העסקה SPRO.
- לוחצים על SAP Reference IMG.
- לוחצים על ABAP SDK for Google Cloud > Basic Settings > Configure Client Key (ABAP SDK for Google Cloud > הגדרות בסיסיות > הגדרת מפתח לקוח)

- מזינים את הערכים הבאים בשדות שמופיעים ברשימה, ומשאירים את כל שאר השדות ריקים:
שדה | ערך |
שם המפתח ב-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 |
Authorization Class | /GOOG/CL_AUTH_GOOGLE |
יצירת דוח ABAP לקבלת חיזויים ממודל BigQuery ML
כדי ליצור דוח ABAP, מבצעים את השלבים הבאים:
- ב-SAP GUI, עוברים לקוד העסקה
SE38ויוצרים תוכנית דוחות בשםZDEMO_BIGQUERY_ML_PREDICT. - בחלון הקופץ שנפתח, מספקים את הפרטים שמוצגים בתמונה הבאה:

- בחלון הקופץ הבא, בוחרים באפשרות Local Object או מזינים שם חבילה, לפי הצורך.
- בעורך 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.
- שומרים ומפעילים את הדוח.
- מריצים את הדוח (F8).
אם ההרצה תתבצע בהצלחה, יופיע פלט של דוח כמו שמוצג בהמשך:


8. מזל טוב
עבודה מצוינת! סיימתם את שיעור ה-Codelab בנושא 'קבלת חיזויים ממודל למידת מכונה (ML) של BigQuery באמצעות ABAP SDK for Google Cloud'.
הצלחתם לאחזר חיזויים ממודל למידת מכונה של BigQuery, ישירות מתוך מערכת SAP! הגעתם לרמה חדשה של שילוב בין ABAP לבין שירותי Google Cloud. כדאי להרחיב את האופקים עם שיעורי Codelab נוספים ומעניינים בנושא ABAP SDK for Google Cloud:
- שימוש ב-Translation API עם ABAP SDK for Google Cloud
- העלאת אובייקט גדול לקטגוריה של Cloud Storage באמצעות חלוקה למקטעי נתונים
- אחזור פרטי כניסה או סודות מ-Secret Manager באמצעות ABAP SDK for Google Cloud
- הפעלת Vertex AI test-bison מ-ABAP
9. הסרת המשאבים
אם לא רוצים להמשיך עם ה-codelabs הנוספים שקשורים ל-ABAP SDK for Google Cloud, אפשר להמשיך לניקוי.
מחיקת הפרויקט
- מחיקת הפרויקט ב-Google Cloud:
gcloud projects delete abap-sdk-poc
מחיקת משאבים ספציפיים
- מוחקים את מכונת החישוב:
gcloud compute instances delete abap-trial-docker
- מוחקים את הכללים של חומת האש:
gcloud compute firewall-rules delete sapmachine
- מוחקים את חשבון השירות:
gcloud iam service-accounts delete \
abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com