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

1. บทนำ

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

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

  • BigQuery
  • Cloud Shell

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

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

  • โมเดลแมชชีนเลิร์นนิง (ML) ของ BigQuery
  • บัญชีบริการที่มีบทบาทผู้ใช้งาน 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 ของ Application Server หากคุณใช้ 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 สำหรับ Google Cloud ไว้
  • คุณต้องทำ Codelab 1 ให้เสร็จสิ้น (ติดตั้ง ABAP Platform แบบทดลองใช้ 1909 บน Google Cloud Platform และติดตั้ง ABAP SDK สำหรับ Google Cloud) และ Codelab 2 (กำหนดค่าการตรวจสอบสิทธิ์ ABAP SDK โดยใช้โทเค็นสำหรับ SAP ที่โฮสต์บน Compute Engine VM) ก่อนที่จะดำเนินการต่อกับ Codelab นี้
  • หากคุณใช้ Codelab 1 และ Codelab 2 จนเสร็จสิ้น ก็น่าจะมอบระบบ ABAP Platform Trial 1909 ใน Google Cloud ให้คุณพร้อมกับการตั้งค่าที่จําเป็นสําหรับการตรวจสอบสิทธิ์และการเชื่อมต่อ
  • ถ้าคุณยังทำ Codelab 1 และ Codelab 2 ไม่เสร็จสิ้น คุณจะไม่มีโครงสร้างพื้นฐานและการเชื่อมต่อที่จำเป็นทั้งหมดเพื่อทำตามขั้นตอนที่ระบุไว้ใน Codelab นี้ ดังนั้นคุณต้องทำ Codelab 1 และ Codelab 2 ให้เสร็จสิ้นก่อนดำเนินการ Codelab นี้

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

  1. คลิกเปิดใช้งาน Cloud Shell ที่มุมขวาบนจาก Cloud Console:

6757b2fb50ddcc2d.png

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

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

b5f52859df2c2f56.png

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

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

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

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

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

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

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

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

3fbc072041bfa313.png

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

สร้างโมเดล 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. รับการคาดการณ์ ML ของ BigQuery โดยใช้ 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 หมายเลขอ้างอิง 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 เพื่อรับการคาดการณ์จากโมเดล ML ของ BigQuery

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

  1. ใน SAP GUI ให้ไปที่รหัสธุรกรรม SE38 และสร้างโปรแกรมรายงานโดยใช้ชื่อ ZDEMO_BIGQUERY_ML_PREDICT.
  2. ในป๊อปอัปที่ปรากฏขึ้น โปรดระบุรายละเอียดดังที่แสดงในรูปภาพต่อไปนี้

4cb32d50427df294.png

  1. ในป๊อปอัปถัดไป ให้เลือก Local Object หรือระบุชื่อแพ็กเกจตามความเหมาะสม
  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 แล้ว ขยายขอบเขตการใช้งานด้วย ABAP SDK อื่นๆ ที่น่าตื่นเต้นสำหรับ Codelab ของ Google Cloud

  • การใช้ Translation API กับ ABAP SDK สำหรับ Google Cloud
  • อัปโหลดออบเจ็กต์ขนาดใหญ่ไปยังที่เก็บข้อมูล Cloud Storage โดยใช้การแบ่งส่วน
  • การดึงข้อมูลเข้าสู่ระบบ/ข้อมูลลับจาก Secret Manager ด้วย ABAP SDK สำหรับ Google Cloud
  • โทรหา Vertex AI ทดสอบควายไบซันจาก 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