Đọc thông tin dự đoán của BigQuery ML trong SAP bằng SDK ABAP cho Google Cloud

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tạo một mô hình học máy (ML) trong BigQuery và nhận thông tin dự đoán từ mô hình này bằng cách sử dụng SDK ABAP cho Google Cloud.

Bạn sẽ tận dụng các dịch vụ sau đây của Google Cloud:

  • BigQuery
  • Cloud Shell

Sản phẩm bạn sẽ tạo ra

Bạn sẽ tạo các thành phần sau:

  • Mô hình Học máy (ML) BigQuery.
  • Tài khoản dịch vụ có vai trò Người dùng công việc BigQuery để gọi BigQuery API.
  • Một chương trình ABAP để gọi BigQuery API và nhận thông tin dự đoán từ mô hình học máy.

2. Yêu cầu

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox.
  • Một dự án Google Cloud đã bật tính năng thanh toán hoặc Tạo tài khoản dùng thử miễn phí 90 ngày cho Google Cloud Platform.
  • SAP GUI (Windows hoặc Java) đã được cài đặt trong hệ thống của bạn. Nếu bạn đã cài đặt SAP GUI trên máy tính xách tay, hãy kết nối với SAP bằng địa chỉ IP bên ngoài của máy ảo làm địa chỉ IP của Máy chủ ứng dụng. Nếu đang dùng máy Mac, bạn cũng có thể cài đặt SAP GUI cho Java có trong đường liên kết này.

3. Trước khi bắt đầu

6757b2fb50ddcc2d.png

  • Chạy các lệnh sau trong Cloud Shell để xác thực cho tài khoản của bạn và đặt dự án mặc định thành abap-sdk-poc. Ví dụ: vùng us-west4-b. Nếu cần, vui lòng thay đổi dự án và vùng trong các lệnh sau đây theo lựa chọn ưu tiên của bạn.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Bạn phải có quyền truy cập vào một hệ thống SAP đã cài đặt SDK ABAP cho Google Cloud.
  • Bạn phải hoàn thành lớp học lập trình 1 (Cài đặt phiên bản dùng thử Nền tảng ABAP 1909 trên Google Cloud Platform và Cài đặt SDK ABAP cho Google Cloud) và lớp học lập trình 2 (Định cấu hình tính năng Xác thực SDK ABAP bằng mã thông báo cho SAP được lưu trữ trên máy ảo Compute Engine) trước khi tiếp tục lớp học lập trình này.
  • Nếu bạn đã hoàn tất lớp học lập trình 1 và lớp học lập trình 2, thì bạn đã được cung cấp Hệ thống dùng thử ABAP Platform 1909 trên Google Cloud, cùng với chế độ thiết lập bắt buộc để xác thực và kết nối.
  • Nếu chưa hoàn tất lớp học lập trình 1 và lớp học lập trình 2, bạn sẽ không có đủ cơ sở hạ tầng và kết nối cần thiết để thực hiện các bước trong lớp học lập trình này. Do đó, bạn phải hoàn tất lớp học lập trình 1 và lớp học lập trình 2 trước khi tiếp tục lớp học lập trình này.

4. Bật BigQuery API V2 trong Dự án Google Cloud

  1. Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell ở góc trên cùng bên phải:

6757b2fb50ddcc2d.png

  1. Chạy các lệnh sau trong Cloud Shell để bật BigQuery API:
gcloud services enable bigquery.googleapis.com

Khi thực thi thành công, bạn sẽ thấy thông báo như sau

b5f52859df2c2f56.png

Bây giờ, bạn đã bật BigQuery API trong Dự án Google Cloud.

5. Tạo tài khoản dịch vụ để truy cập an toàn vào BigQuery

Để nhận thông tin dự đoán về công nghệ học máy một cách an toàn từ mô hình học máy BigQuery, bạn cần tạo một tài khoản dịch vụ có vai trò Người dùng công việc BigQueryNgười xem dữ liệu BigQuery. Tài khoản này sẽ cho phép chương trình của bạn chạy truy vấn (dưới dạng công việc) trong dự án và đọc dữ liệu từ các bảng. Vai trò này chỉ cấp quyền cần thiết để tạo công việc và đọc dữ liệu, giúp giảm thiểu rủi ro bảo mật.

Tạo một tài khoản dịch vụ

Để tạo tài khoản dịch vụ có vai trò bắt buộc, hãy thực hiện các bước sau:

  1. Chạy lệnh sau trong dòng lệnh Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Bây giờ, hãy thêm các vai trò bắt buộc vào tài khoản dịch vụ đã tạo ở bước trước:
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'

Lệnh trên sử dụng abap-sdk-poc làm phần giữ chỗ cho Dự án Google Cloud. Thay thế abap-sdk-poc bằng mã dự án của bạn.

  1. Để xác minh vai trò đã được thêm, hãy chuyển đến trang IAM. Tài khoản dịch vụ mà bạn đã tạo sẽ xuất hiện cùng với vai trò đã được chỉ định cho tài khoản đó.

6. Tạo mô hình Học máy BigQuery

Trong lớp học lập trình này, chúng ta sẽ tạo một mô hình k-means để phân cụm tập dữ liệu về dịch vụ thuê xe đạp ở London. Bạn có thể áp dụng thuật toán k-means để nhóm dữ liệu thành các cụm. Không giống như công nghệ học máy có giám sát (dành cho phân tích dự đoán), công nghệ học máy không giám sát (dành cho phân tích mô tả). Mục đích là để bạn hiểu rõ dữ liệu của mình, từ đó đưa ra quyết định dựa trên dữ liệu.

Tạo tập dữ liệu

Để tạo một tập dữ liệu BigQuery nhằm lưu trữ mô hình học máy, hãy thực hiện các bước sau:

  1. Trong Google Cloud Console, hãy chuyển đến trang BigQuery. Chuyển đến trang BigQuery
  2. Trong ngăn Explorer (Trình khám phá), hãy nhấp vào tên dự án của bạn.
  3. Nhấp vào 5cf3b742649f1e2c.png Xem thao tác > Tạo tập dữ liệu.

3fbc072041bfa313.png

  1. Trên trang Tạo tập dữ liệu, hãy làm như sau:
  • Nhập bqml_tutorial cho Mã tập dữ liệu.
  • Đối với Loại vị trí, hãy chọn Nhiều khu vực, sau đó chọn Liên minh Châu Âu (nhiều khu vực ở Liên minh Châu Âu). Tập dữ liệu công khai về dịch vụ Thuê xe đạp ở London được lưu trữ ở nhiều khu vực của Liên minh Châu Âu. Tập dữ liệu của bạn phải ở cùng một vị trí.
  • Giữ nguyên các chế độ cài đặt mặc định còn lại rồi nhấp vào Tạo tập dữ liệu. Trang Tạo tập dữ liệu.

Tạo mô hình k-means

Giờ đây, khi tập dữ liệu đã được thiết lập, bước tiếp theo là tạo mô hình k-means bằng dữ liệu đó. Bạn có thể tạo và huấn luyện mô hình k-means bằng cách sử dụng câu lệnh CREATE MODEL (TẠO MÔ HÌNH) với tuỳ chọn model_type=kmeans.

Để chạy truy vấn và tạo mô hình k-means, hãy thực hiện các bước sau:

  1. Chuyển đến trang BigQuery. Chuyển đến BigQuery
  2. Trong ngăn trình chỉnh sửa, hãy chạy câu lệnh SQL sau:
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. Trong bảng điều hướng, trong phần Tài nguyên, hãy mở rộng tên dự án, nhấp vào bqml_tutorial, rồi nhấp vào london_station_clusters.
  2. Nhấp vào thẻ Schema (Giản đồ). Giản đồ mô hình liệt kê 3 thuộc tính trạm mà BigQuery ML dùng để thực hiện hoạt động phân cụm. Sơ đồ sẽ có dạng như sau:

5f1feb313bd0f6a5.png

  1. Nhấp vào thẻ Đánh giá. Thẻ này hiển thị hình ảnh trực quan của các cụm được xác định bằng mô hình k-means. Trong mục Tính năng dạng số, biểu đồ thanh hiển thị tối đa 10 giá trị tính năng dạng số quan trọng nhất cho mỗi tâm điểm. Bạn có thể chọn các tính năng cần trực quan hoá trong trình đơn thả xuống.

8f9b53971e33dc08.png

7. Nhận kết quả dự đoán của BigQuery ML bằng cách sử dụng SDK ABAP cho Google Cloud

Giờ đây, khi đã thiết lập các điều kiện tiên quyết ở phía Google Cloud, bạn đã sẵn sàng hoàn tất các bước trong hệ thống SAP để nhận thông tin dự đoán từ mô hình học máy bằng cách sử dụng SDK ABAP cho Google Cloud.

Tạo cấu hình khoá ứng dụng

Đối với cấu hình liên quan đến việc xác thực và kết nối, SDK ABAP cho Google Cloud sử dụng các bảng /GOOG/CLIENT_KEY/GOOG/SERVIC_MAP.

Để duy trì cấu hình trong bảng /GOOG/CLIENT_KEY, hãy thực hiện các bước sau:

  1. Trong SAP GUI, hãy nhập mã giao dịch SPRO.
  2. Nhấp vào SAP Reference IMG (Hình ảnh tham chiếu SAP).
  3. Nhấp vào ABAP SDK for Google Cloud (SDK ABAP cho Google Cloud) > Basic Settings (Cài đặt cơ bản) > Configure Client Key (Định cấu hình khoá ứng dụng)

25871e639293b9ee.png

  1. Duy trì các giá trị sau đây cho các trường được liệt kê, để trống tất cả các trường khác:

Trường

Giá trị

Tên khoá Google Cloud

BIGQUERY_ML

Tên tài khoản dịch vụ Google Cloud

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

Phạm vi Google Cloud

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

Mã dự án

abap-sdk-poc

Lớp uỷ quyền

/GOOG/CL_AUTH_GOOGLE

Tạo Báo cáo ABAP để nhận thông tin dự đoán từ mô hình BigQuery ML

Để tạo Báo cáo ABAP, hãy thực hiện các bước sau:

  1. Trong SAP GUI, hãy chuyển đến mã giao dịch SE38 và tạo một Chương trình báo cáo có tên ZDEMO_BIGQUERY_ML_PREDICT.
  2. Trong cửa sổ bật lên, hãy cung cấp thông tin chi tiết như trong hình sau:

4cb32d50427df294.png

  1. Trong cửa sổ bật lên tiếp theo, hãy chọn Local Object (Đối tượng cục bộ) hoặc cung cấp tên gói phù hợp.
  2. Trong Trình chỉnh sửa ABAP, hãy thêm mã sau:
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. Lưu và kích hoạt báo cáo.
  2. Thực thi báo cáo (F8).

Khi thực thi thành công, bạn sẽ thấy kết quả báo cáo như dưới đây:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Xin chúc mừng

Xin chúc mừng bạn đã hoàn thành lớp học lập trình "Nhận thông tin dự đoán từ mô hình Học máy (ML) BigQuery bằng SDK ABAP cho Google Cloud"!

Bạn đã truy xuất thành công kết quả dự đoán của một mô hình Học máy BigQuery ngay trong hệ thống SAP! Bạn đã đạt được một cấp độ tích hợp mới giữa ABAP và Dịch vụ đám mây của Google. Mở rộng tầm nhìn của bạn với các lớp học lập trình thú vị khác về SDK ABAP cho Google Cloud:

  • Sử dụng API Dịch bằng SDK ABAP cho Google Cloud
  • Tải một đối tượng lớn lên bộ chứa Cloud Storage bằng cách phân đoạn
  • Truy xuất thông tin xác thực/bí mật từ Trình quản lý bí mật bằng SDK ABAP cho Google Cloud
  • Gọi Vertex AI test-bison từ ABAP

9. Dọn dẹp

Nếu bạn không muốn tiếp tục các lớp học lập trình bổ sung liên quan đến SDK ABAP cho Google Cloud, vui lòng tiến hành dọn dẹp.

Xoá dự án

  • Xoá dự án trên Google Cloud:
gcloud projects delete abap-sdk-poc

Xoá từng tài nguyên

  1. Xoá thực thể máy tính:
gcloud compute instances delete abap-trial-docker
  1. Xoá firewall-rules:
gcloud compute firewall-rules delete sapmachine
  1. Xoá tài khoản dịch vụ:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com