قراءة توقّعات تعلُّم الآلة في BigQuery في SAP باستخدام حزمة تطوير البرامج (SDK) ABAP في Google Cloud

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستنشئ نموذج تعلُّم الآلة في BigQuery وستحصل على توقّعات من هذا النموذج باستخدام ABAP SDK لخدمة Google Cloud.

ستتمكن من الاستفادة من خدمات Google Cloud التالية:

  • BigQuery
  • Cloud Shell

ما الذي ستقوم ببنائه

ستقوم بإنشاء ما يلي:

  • نموذج تعلُّم الآلة في BigQuery.
  • حساب خدمة يتضمّن دور "مستخدم المهمة في BigQuery" لطلب BigQuery API
  • برنامج ABAP لطلب واجهة برمجة تطبيقات BigQuery والحصول على توقّعات من نموذج تعلُّم الآلة

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

  • شغِّل الأوامر التالية في 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.
  • عليك إكمال الدرس التطبيقي 1 حول الترميز (تثبيت الإصدار التجريبي من ABAP Platform لعام 1909 على Google Cloud Platform وتثبيت حزمة تطوير البرامج ABAP لخدمة Google Cloud) والدرس التطبيقي حول الترميز 2 (إعداد مصادقة ABAP SDK باستخدام الرموز المميّزة لـ SAP المستضافة على Compute Engine VM) قبل مواصلة هذا الدرس التطبيقي حول الترميز.
  • إذا أكملت التمرين التطبيقي عن الترميز 1 والدرس التطبيقي حول الترميز، كان من الممكن أن يمنحك ذلك نظام ABAP Platform التجريبي 1909 على Google Cloud، إلى جانب الإعداد المطلوب للمصادقة والاتصال.
  • إذا لم تكن قد أكملت التمرينَين التطبيقيَين حول الترميز 1 والدرسَين التطبيقيَين حول الترميز، لن تتوفّر لديك كل البنية الأساسية وإمكانية الاتصال المطلوبة لتنفيذ الخطوات الواردة في هذا الدرس التطبيقي حول الترميز. لذلك، عليك إكمال الدرس التطبيقي حول الترميز 1 والدرس التطبيقي حول الترميز قبل مواصلة هذا الدرس التطبيقي حول الترميز.

4. تفعيل الإصدار الثاني من BigQuery API في مشروع Google Cloud

  1. من Cloud Console، انقر على تفعيل Cloud Shell في أعلى يسار الصفحة:

6757b2fb50ddcc2d.png

  1. شغِّل الأوامر التالية في Cloud Shell لتفعيل BigQuery API:
gcloud services enable bigquery.googleapis.com

عند التنفيذ بنجاح، يجب أن تظهر رسالة كما هو موضّح أدناه

b5f52859df2c2f56.png

من المفترض أن تكون BigQuery API مفعّلة الآن في مشروع 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. للتأكّد من أنّه تمت إضافة الدور، انتقِل إلى صفحة إدارة الهوية وإمكانية الوصول. يجب إدراج حساب الخدمة الذي أنشأته إلى جانب الدور الذي تم إسناده إليه.

6- إنشاء نموذج تعلُّم الآلة في BigQuery

في هذا التمرين المعملي، سننشئ نموذجًا للخوارزمية التصنيفية لتجميع مجموعة بيانات استئجار الدراجات في لندن. يمكنك تطبيق خوارزمية الخوارزمية التصنيفية لتجميع بياناتك في مجموعات عنقودية. على عكس تعلُّم الآلة المراقَب الذي يدور حول التحليلات التنبئية، يتعلّق التعلّم غير الخاضع للإشراف بالتحليلات الوصفية. يتعلق الأمر بفهم بياناتك حتى تتمكن من اتخاذ قرارات تستند إلى البيانات.

إنشاء مجموعة البيانات

لإنشاء مجموعة بيانات BigQuery لتخزين نموذج تعلُّم الآلة، عليك اتّباع الخطوات التالية:

  1. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة BigQuery. الانتقال إلى صفحة BigQuery
  2. في جزء المستكشف، انقر على اسم مشروعك.
  3. النقر على 5cf3b742649f1e2c.png عرض الإجراءات > أنشئ مجموعة بيانات.

3fbc072041bfa313.png

  1. في صفحة إنشاء مجموعة بيانات، نفِّذ ما يلي:
  • بالنسبة إلى رقم تعريف مجموعة البيانات، أدخِل bqml_tutorial.
  • بالنسبة إلى نوع الموقع الجغرافي، اختَر متعدّد المناطق، ثم اختَر الاتحاد الأوروبي (عدة مناطق في الاتحاد الأوروبي). يتم تخزين مجموعة البيانات العامة لبيع الدراجات في لندن في متعددة المناطق الخاصة بالاتحاد الأوروبي. يجب أن تكون مجموعة البيانات في الموقع نفسه.
  • اترك الإعدادات التلقائية المتبقية كما هي، وانقر على إنشاء مجموعة بيانات. إنشاء صفحة مجموعة البيانات.

إنشاء نموذج الخوارزمية التصنيفية

الآن بعد إعداد مجموعة البيانات، تتمثل الخطوة التالية في إنشاء نموذج الخوارزمية التصنيفية باستخدام البيانات. يمكنك إنشاء نموذج الخوارزمية التصنيفية وتدريبه باستخدام العبارة CREATE MODEL مع الخيار model_type=kmeans.

لتشغيل الاستعلام وإنشاء نموذج الخوارزمية التصنيفية، قم بتنفيذ الخطوات التالية:

  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. انقر على علامة التبويب التقييم. تعرض علامة التبويب هذه تصورات للمجموعات العنقودية المحددة بواسطة نموذج الخوارزمية التصنيفية. ضمن الميزات الرقمية، تعرض الرسوم البيانية الشريطية ما يصل إلى 10 من أهم قيم الميزات الرقمية لكل نقطة مركزية. يمكنك تحديد الميزات المطلوب عرضها من القائمة المنسدلة.

8f9b53971e33dc08.png

7. الحصول على توقعات تعلُّم الآلة في BigQuery باستخدام حزمة تطوير البرامج (SDK) ABAP في Google Cloud

بعد أن أعددت المتطلبات الأساسية من جانب Google Cloud، أصبحت جاهزًا لإكمال الخطوات في نظام SAP لتلقّي توقّعات من نموذج تعلُّم الآلة باستخدام حزمة ABAP SDK في Google Cloud.

إنشاء إعدادات مفتاح العميل

بالنسبة إلى الإعدادات المرتبطة بالمصادقة والاتصال، تستخدم حزمة تطوير البرامج (SDK) ABAP في Google Cloud الجدولَين /GOOG/CLIENT_KEY و/GOOG/SERVIC_MAP..

للحفاظ على الإعدادات في جدول /GOOG/CLIENT_KEY، اتّبِع الخطوات التالية:

  1. في SAP GUI، أدخِل رمز المعاملة SPRO.
  2. انقر على SAP Reference IMG.
  3. انقر على ABAP SDK for Google Cloud > الإعدادات الأساسية > إعداد مفتاح العميل

25871e639293b9ee.png

  1. حافظ على القيم التالية مقابل الحقول المدرجة، واترك جميع الحقول الأخرى فارغة:

الحقل

القيمة

اسم Google Cloud Key

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. تهانينا

عمل ممتاز بإكمال "الحصول على توقعات من نموذج تعلُّم الآلة في BigQuery باستخدام حزمة ABAP SDK for Google Cloud" codelab!

لقد نجحت في استرداد توقّعات نموذج تعلُّم الآلة في BigQuery من داخل نظام SAP مباشرةً. لقد انتقلت إلى مستوى جديد من الدمج بين ABAP وخدمات Google Cloud. يمكنك توسيع آفاقك من خلال حزمة تطوير برامج ABAP الأخرى الرائعة التي تشكّل دروسًا تطبيقية حول الترميز في Google Cloud:

  • استخدام واجهة برمجة التطبيقات Translation API مع حزمة تطوير البرامج (SDK) ABAP في Google Cloud
  • تحميل عنصر كبير إلى حزمة Cloud Storage باستخدام التقسيم
  • استرداد بيانات الاعتماد أو الأسرار من المدير السري باستخدام حزمة تطوير البرامج (SDK) ABAP لخدمات Google Cloud
  • استدعاء Vertex AI اختبار البيسون من ABAP

9. تَنظيم

إذا أردت التوقف عن استخدام الدروس التطبيقية الإضافية حول الترميز ذات الصلة بحزمة تطوير البرامج (SDK) ABAP في 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