อ่านการคาดการณ์ของ BigQuery ML ใน SAP โดยใช้ ABAP SDK สําหรับ Google Cloud

1. บทนำ

ในโค้ดแล็บนี้ คุณจะได้สร้างโมเดลแมชชีนเลิร์นนิง (ML) ใน BigQuery และรับการคาดการณ์จากโมเดลนี้โดยใช้ ABAP SDK สําหรับ Google Cloud

คุณจะใช้บริการต่อไปนี้ของ Google Cloud ได้

  • BigQuery
  • Cloud Shell

สิ่งที่คุณจะสร้าง

คุณจะต้องสร้างสิ่งต่อไปนี้

  • โมเดลแมชชีนเลิร์นนิง (ML) ของ BigQuery
  • บัญชีบริการที่มีบทบาทผู้ใช้ Job ของ BigQuery เพื่อเรียกใช้ BigQuery API
  • โปรแกรม ABAP เพื่อเรียกใช้ BigQuery API และรับการคาดการณ์จากโมเดล ML

2. ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินหรือสร้างบัญชีทดลองใช้ฟรี 90 วันสำหรับ Google Cloud Platform
  • SAP GUI (Windows หรือ Java) ที่ติดตั้งในระบบ หากติดตั้ง SAP GUI ในแล็ปท็อปอยู่แล้ว ให้เชื่อมต่อกับ SAP โดยใช้ที่อยู่ IP ภายนอกของ VM เป็น IP ของเซิร์ฟเวอร์แอปพลิเคชัน หากใช้ Mac คุณสามารถติดตั้ง SAP GUI for 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 สําหรับ Google Cloud
  • คุณต้องทํา Codelab 1 (ติดตั้งแพลตฟอร์ม ABAP รุ่นทดลอง 1909 ใน Google Cloud Platform และติดตั้ง ABAP SDK สําหรับ Google Cloud) และ Codelab 2 (กําหนดค่าการตรวจสอบสิทธิ์ ABAP SDK โดยใช้โทเค็นสําหรับ SAP ที่โฮสต์ใน VM ของ Compute Engine) ให้เสร็จสมบูรณ์ก่อนจึงจะดําเนินการต่อใน Codelab นี้
  • หากคุณทำ Codelab 1 และ Codelab 2 เสร็จแล้ว ระบบจะจัดสรรระบบเวอร์ชันทดลอง 1909 ของ ABAP Platform บน Google Cloud ให้คุณ พร้อมกับการตั้งค่าที่จำเป็นสำหรับการตรวจสอบสิทธิ์และการเชื่อมต่อ
  • หากคุณยังไม่ได้ทํา Codelab 1 และ Codelab 2 ให้เสร็จสิ้น คุณจะไม่มีโครงสร้างพื้นฐานและการเชื่อมต่อที่จําเป็นทั้งหมดเพื่อทําตามขั้นตอนที่ระบุไว้ใน Codelab นี้ ดังนั้น คุณต้องทํา Codelab 1 และ Codelab 2 ให้เสร็จก่อนจึงจะทํา Codelab นี้ได้

4. เปิดใช้ BigQuery API V2 ในโปรเจ็กต์ Google Cloud

  1. จากคอนโซลระบบคลาวด์ ให้คลิกเปิดใช้งาน Cloud Shell ที่มุมขวาบน

6757b2fb50ddcc2d.png

  1. เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อเปิดใช้ BigQuery API
gcloud services enable bigquery.googleapis.com

เมื่อดำเนินการเสร็จเรียบร้อยแล้ว คุณควรเห็นข้อความแสดงดังที่แสดงด้านล่าง

b5f52859df2c2f56.png

ตอนนี้คุณควรเปิดใช้ BigQuery API ในโปรเจ็กต์ Google Cloud แล้ว

5. สร้างบัญชีบริการสำหรับการเข้าถึง BigQuery ที่ปลอดภัย

หากต้องการรับการคาดการณ์ ML จากโมเดล BigQuery ML อย่างปลอดภัย คุณต้องสร้างบัญชีบริการที่มีบทบาทผู้ใช้งาน 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. ไปที่หน้า IAM เพื่อยืนยันว่าได้เพิ่มบทบาทแล้ว บัญชีบริการที่คุณสร้างขึ้นควรแสดงพร้อมกับบทบาทที่กำหนดไว้

6. การสร้างโมเดลแมชชีนเลิร์นนิงของ BigQuery

ในโค้ดแล็บนี้ เราจะสร้างโมเดล K-Means เพื่อจัดกลุ่มชุดข้อมูลการเช่าจักรยานในลอนดอน คุณสามารถใช้อัลกอริทึม k-means เพื่อจัดกลุ่มข้อมูลเป็นคลัสเตอร์ได้ การเรียนรู้ที่ไม่มีการควบคุมดูแลแตกต่างจากแมชชีนเลิร์นนิงที่มีการควบคุมดูแลซึ่งเกี่ยวข้องกับการวิเคราะห์เชิงคาดการณ์ การทำความเข้าใจข้อมูลเพื่อให้คุณตัดสินใจโดยใช้ข้อมูล

สร้างชุดข้อมูล

หากต้องการสร้างชุดข้อมูล BigQuery เพื่อจัดเก็บโมเดล ML ให้ทําตามขั้นตอนต่อไปนี้

  1. ไปที่หน้า BigQuery ในคอนโซล Google Cloud ไปที่หน้า BigQuery
  2. คลิกชื่อโปรเจ็กต์ในแผง Explorer
  3. คลิก 5cf3b742649f1e2c.png ดูการดําเนินการ > สร้างชุดข้อมูล

3fbc072041bfa313.png

  1. ในหน้าสร้างชุดข้อมูล ให้ทําดังนี้
  • ป้อน bqml_tutorial สำหรับรหัสชุดข้อมูล
  • ในส่วนประเภทสถานที่ ให้เลือกหลายภูมิภาค แล้วเลือกสหภาพยุโรป (หลายภูมิภาคในสหภาพยุโรป) ชุดข้อมูลสาธารณะของ London Bicycle Hires จัดเก็บอยู่ในหลายภูมิภาคของสหภาพยุโรป ชุดข้อมูลต้องอยู่ในตำแหน่งเดียวกัน
  • ปล่อยการตั้งค่าเริ่มต้นที่เหลือไว้ แล้วคลิกสร้างชุดข้อมูล สร้างหน้าชุดข้อมูล

สร้างโมเดล K-Means

เมื่อตั้งค่าชุดข้อมูลแล้ว ขั้นตอนถัดไปคือสร้างโมเดล K-Means โดยใช้ข้อมูล คุณสามารถสร้างและฝึกโมเดล K-Means ได้โดยใช้คำสั่ง 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. ในแผงการนำทาง ให้ขยายชื่อโปรเจ็กต์ในส่วนทรัพยากร แล้วคลิก bqml_tutorial จากนั้นคลิก london_station_clusters
  2. คลิกแท็บสคีมา สคีมาโมเดลจะแสดงแอตทริบิวต์สถานี 3 รายการที่ BigQuery ML ใช้เพื่อทำการคลัสเตอร์ สคีมาควรมีลักษณะดังต่อไปนี้

5f1feb313bd0f6a5.png

  1. คลิกแท็บการประเมิน แท็บนี้จะแสดงภาพคลัสเตอร์ที่ระบุโดยโมเดล 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 > การตั้งค่าพื้นฐาน > กําหนดค่าคีย์ไคลเอ็นต์

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 ML

หากต้องการสร้างรายงาน ABAP ให้ทําตามขั้นตอนต่อไปนี้

  1. ใน SAP GUI ให้ไปที่รหัสธุรกรรม 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. ขอแสดงความยินดี

เยี่ยมมากที่ทํา Codelab "รับการคาดการณ์จากโมเดลแมชชีนเลิร์นนิง (ML) ของ BigQuery โดยใช้ ABAP SDK สําหรับ Google Cloud" จนเสร็จสมบูรณ์

คุณได้ดึงข้อมูลการคาดการณ์ของโมเดลแมชชีนเลิร์นนิงของ BigQuery สำเร็จแล้วจากในระบบ SAP คุณปลดล็อกการผสานรวมระดับใหม่ระหว่าง ABAP กับบริการของ Google Cloud แล้ว ขยายขอบเขตความรู้ด้วย Codelab อื่นๆ ที่น่าสนใจของ ABAP SDK สําหรับ Google Cloud

  • การใช้ Translation API กับ ABAP SDK สําหรับ Google Cloud
  • อัปโหลดออบเจ็กต์ขนาดใหญ่ไปยังที่เก็บข้อมูล Cloud Storage โดยใช้การแบ่งกลุ่ม
  • การดึงข้อมูลเข้าสู่ระบบ/ข้อมูลลับจาก Secret Manager ด้วย ABAP SDK สําหรับ Google Cloud
  • เรียกใช้ Vertex AI test-bison จาก ABAP

9. ล้างข้อมูล

หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ 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