เกี่ยวกับ Codelab นี้
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 ก่อนเริ่มต้น
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ (เช่น
abap-sdk-poc
) - ตรวจสอบว่าเปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าเปิดใช้การเรียกเก็บเงินในโปรเจ็กต์หรือไม่ โปรดข้ามขั้นตอนนี้หากคุณใช้บัญชีทดลองใช้ฟรี 90 วัน
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud
- จากคอนโซลระบบคลาวด์ ให้คลิกเปิดใช้งาน 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 สําหรับ 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
- จากคอนโซลระบบคลาวด์ ให้คลิกเปิดใช้งาน Cloud Shell ที่มุมขวาบน
- เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อเปิดใช้ BigQuery API
gcloud services enable bigquery.googleapis.com
เมื่อดำเนินการเสร็จเรียบร้อยแล้ว คุณควรเห็นข้อความแสดงดังที่แสดงด้านล่าง
ตอนนี้คุณควรเปิดใช้ BigQuery API ในโปรเจ็กต์ Google Cloud แล้ว
5 สร้างบัญชีบริการสำหรับการเข้าถึง BigQuery ที่ปลอดภัย
หากต้องการรับการคาดการณ์ ML จากโมเดล BigQuery ML อย่างปลอดภัย คุณต้องสร้างบัญชีบริการที่มีบทบาทผู้ใช้งาน BigQuery และผู้ดูข้อมูล BigQuery ซึ่งจะช่วยให้โปรแกรมเรียกใช้การค้นหา (เป็นงาน) ภายในโปรเจ็กต์และอ่านข้อมูลจากตารางได้ บทบาทนี้จะให้เฉพาะสิทธิ์ที่จำเป็นในการสร้างงานและอ่านข้อมูล ซึ่งจะช่วยลดความเสี่ยงด้านความปลอดภัย
สร้างบัญชีบริการ
หากต้องการสร้างบัญชีบริการที่มีบทบาทที่จําเป็น ให้ทําตามขั้นตอนต่อไปนี้
- เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล 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
เป็นตัวยึดตําแหน่งสำหรับโปรเจ็กต์ Google Cloud แทนที่ abap-sdk-poc
ด้วยรหัสโปรเจ็กต์
- ไปที่หน้า IAM เพื่อยืนยันว่าได้เพิ่มบทบาทแล้ว บัญชีบริการที่คุณสร้างขึ้นควรแสดงพร้อมกับบทบาทที่กำหนดไว้
6 การสร้างโมเดลแมชชีนเลิร์นนิงของ BigQuery
ในโค้ดแล็บนี้ เราจะสร้างโมเดล K-Means เพื่อจัดกลุ่มชุดข้อมูลการเช่าจักรยานในลอนดอน คุณสามารถใช้อัลกอริทึม k-means เพื่อจัดกลุ่มข้อมูลเป็นคลัสเตอร์ได้ การเรียนรู้ที่ไม่มีการควบคุมดูแลแตกต่างจากแมชชีนเลิร์นนิงที่มีการควบคุมดูแลซึ่งเกี่ยวข้องกับการวิเคราะห์เชิงคาดการณ์ การทำความเข้าใจข้อมูลเพื่อให้คุณตัดสินใจโดยใช้ข้อมูล
สร้างชุดข้อมูล
หากต้องการสร้างชุดข้อมูล BigQuery เพื่อจัดเก็บโมเดล ML ให้ทําตามขั้นตอนต่อไปนี้
- ไปที่หน้า BigQuery ในคอนโซล Google Cloud ไปที่หน้า BigQuery
- คลิกชื่อโปรเจ็กต์ในแผง Explorer
- คลิก
ดูการดําเนินการ > สร้างชุดข้อมูล
- ในหน้าสร้างชุดข้อมูล ให้ทําดังนี้
- ป้อน
bqml_tutorial
สำหรับรหัสชุดข้อมูล - ในส่วนประเภทสถานที่ ให้เลือกหลายภูมิภาค แล้วเลือกสหภาพยุโรป (หลายภูมิภาคในสหภาพยุโรป) ชุดข้อมูลสาธารณะของ London Bicycle Hires จัดเก็บอยู่ในหลายภูมิภาคของสหภาพยุโรป ชุดข้อมูลต้องอยู่ในตำแหน่งเดียวกัน
- ปล่อยการตั้งค่าเริ่มต้นที่เหลือไว้ แล้วคลิกสร้างชุดข้อมูล
สร้างโมเดล 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
- คลิกแท็บสคีมา สคีมาโมเดลจะแสดงแอตทริบิวต์สถานี 3 รายการที่ BigQuery ML ใช้เพื่อทำการคลัสเตอร์ สคีมาควรมีลักษณะดังต่อไปนี้
- คลิกแท็บการประเมิน แท็บนี้จะแสดงภาพคลัสเตอร์ที่ระบุโดยโมเดล K-Means ในส่วนฟีเจอร์ตัวเลข กราฟแท่งจะแสดงค่าฟีเจอร์ตัวเลขที่สําคัญที่สุดสูงสุด 10 ค่าสําหรับเซนทรอยด์แต่ละรายการ คุณเลือกฟีเจอร์ที่จะแสดงภาพได้จากเมนูแบบเลื่อนลง
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
ให้ทําตามขั้นตอนต่อไปนี้
- ใน SAP GUI ให้ป้อนรหัสธุรกรรม SPRO
- คลิก SAP Reference IMG
- คลิก ABAP SDK สําหรับ 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 |
คลาสการให้สิทธิ์ | /GOOG/CL_AUTH_GOOGLE |
สร้างรายงาน ABAP เพื่อรับการคาดการณ์จากโมเดล BigQuery ML
หากต้องการสร้างรายงาน ABAP ให้ทําตามขั้นตอนต่อไปนี้
- ใน SAP GUI ให้ไปที่รหัสธุรกรรม
SE38
และสร้างโปรแกรมรายงานชื่อZDEMO_BIGQUERY_ML_PREDICT.
- ในป๊อปอัปที่เปิดขึ้น ให้ระบุรายละเอียดตามที่แสดงในรูปภาพต่อไปนี้
- ในป๊อปอัปถัดไป ให้เลือกออบเจ็กต์ในเครื่องหรือระบุชื่อแพ็กเกจตามความเหมาะสม
- ในตัวแก้ไข 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 สําหรับ 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
ลบทรัพยากรแต่ละรายการ
- ลบอินสแตนซ์การประมวลผลโดยทำดังนี้
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