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 สำหรับ Java ได้ด้วยโดยไปที่ลิงก์นี้
3. ก่อนเริ่มต้น
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ (เช่น
abap-sdk-poc
) - ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่ โปรดข้ามขั้นตอนนี้หากคุณใช้บัญชีทดลองใช้ฟรี 90 วัน
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud
- จาก Cloud Console ให้คลิกเปิดใช้งาน 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 Platform Trial 1909 ใน Google Cloud Platform และติดตั้ง ABAP SDK สำหรับ Google Cloud) และ Codelab 2 (กำหนดค่าการตรวจสอบสิทธิ์ ABAP SDK โดยใช้โทเค็นสำหรับ SAP ที่โฮสต์ใน VM ของ Compute Engine) ให้เสร็จสมบูรณ์ก่อนที่จะดำเนินการกับ Codelab นี้
- หากคุณทำ Codelab 1 และ Codelab 2 เสร็จแล้ว ระบบจะจัดสรรระบบทดลองใช้ ABAP Platform 1909 บน Google Cloud พร้อมกับการตั้งค่าที่จำเป็นสำหรับการตรวจสอบสิทธิ์และการเชื่อมต่อให้คุณ
- หากยังไม่ได้ทำ codelab 1 และ codelab 2 คุณจะไม่มีโครงสร้างพื้นฐานและการเชื่อมต่อที่จำเป็นทั้งหมดเพื่อทำตามขั้นตอนที่ระบุไว้ใน codelab นี้ ดังนั้น คุณต้องทำ Codelab 1 และ Codelab 2 ให้เสร็จก่อนจึงจะทำ Codelab นี้ต่อได้
4. เปิดใช้ BigQuery API V2 ในโปรเจ็กต์ Google Cloud
- จาก Cloud Console ให้คลิกเปิดใช้งาน 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 Console ไปที่หน้า 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 Editor ให้เพิ่มโค้ดต่อไปนี้
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
- เรียกใช้ test-bison ของ Vertex AI จาก ABAP
9. ล้างข้อมูล
หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ ABAP SDK สำหรับ Google Cloud ต่อ โปรดดำเนินการล้างข้อมูล
ลบโปรเจ็กต์
- ลบโปรเจ็กต์ Google Cloud โดยทำดังนี้
gcloud projects delete abap-sdk-poc
ลบทรัพยากรแต่ละรายการ
- ลบอินสแตนซ์ Compute โดยทำดังนี้
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