Membaca prediksi BigQuery ML di SAP menggunakan ABAP SDK untuk Google Cloud

1. Pengantar

Dalam codelab ini, Anda akan membuat model machine learning (ML) di BigQuery dan mendapatkan prediksi dari model ini menggunakan ABAP SDK untuk Google Cloud.

Anda akan memanfaatkan layanan Google Cloud berikut:

  • BigQuery
  • Cloud Shell

Yang akan Anda build

Anda akan membuat hal berikut:

  • Model BigQuery Machine Learning (ML).
  • Akun layanan dengan peran BigQuery Job User untuk memanggil BigQuery API.
  • Program ABAP untuk memanggil BigQuery API dan mendapatkan prediksi dari model ML.

2. Persyaratan

  • Browser, seperti Chrome atau Firefox.
  • Project Google Cloud dengan penagihan diaktifkan atau Buat akun Uji Coba Gratis 90 Hari untuk Google Cloud Platform.
  • SAP GUI (Windows atau Java) yang diinstal di sistem Anda. Jika SAP GUI sudah diinstal di laptop, hubungkan ke SAP menggunakan alamat IP eksternal VM sebagai IP Server Aplikasi. Jika menggunakan Mac, Anda juga dapat menginstal SAP GUI untuk Java yang tersedia di link ini.

3. Sebelum memulai

6757b2fb50ddcc2d.png

  • Jalankan perintah berikut di Cloud Shell untuk mengautentikasi akun Anda dan menetapkan project default ke abap-sdk-poc. Zona us-west4-b digunakan sebagai contoh. Jika diperlukan, ubah project dan zona dalam perintah berikut berdasarkan preferensi Anda.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • Anda harus memiliki akses ke sistem SAP yang telah menginstal ABAP SDK untuk Google Cloud.
  • Anda harus menyelesaikan codelab 1 (Menginstal Uji Coba Platform ABAP 1909 di Google Cloud Platform dan Menginstal ABAP SDK untuk Google Cloud) dan codelab 2 (Mengonfigurasi Autentikasi ABAP SDK menggunakan token untuk SAP yang Dihosting di VM Compute Engine) sebelum melanjutkan dengan codelab ini.
  • Jika Anda telah menyelesaikan codelab 1 dan codelab 2, Anda akan mendapatkan Sistem Uji Coba Platform ABAP 1909 di Google Cloud, beserta penyiapan yang diperlukan untuk autentikasi dan konektivitas.
  • Jika belum menyelesaikan codelab 1 dan codelab 2, Anda tidak akan memiliki semua infrastruktur dan konektivitas yang diperlukan untuk melakukan langkah-langkah yang diberikan dalam codelab ini. Oleh karena itu, Anda harus menyelesaikan codelab 1 dan codelab 2 sebelum melanjutkan codelab ini.

4. Mengaktifkan BigQuery API V2 di Project Google Cloud Anda

  1. Dari Cloud Console, klik Activate Cloud Shell di pojok kanan atas:

6757b2fb50ddcc2d.png

  1. Jalankan perintah berikut di Cloud Shell untuk mengaktifkan BigQuery API:
gcloud services enable bigquery.googleapis.com

Setelah eksekusi berhasil, Anda akan melihat pesan yang ditampilkan seperti yang ditunjukkan di bawah ini

b5f52859df2c2f56.png

Sekarang Anda seharusnya telah mengaktifkan BigQuery API di Project Google Cloud.

5. Membuat Akun Layanan untuk Akses BigQuery yang Aman

Untuk mendapatkan prediksi ML dengan aman dari model BigQuery ML, Anda perlu membuat akun layanan dengan peran BigQuery Job User dan BigQuery Data Viewer, yang akan memungkinkan program Anda menjalankan kueri (sebagai tugas) dalam project dan membaca data dari tabel. Peran ini hanya memberikan izin yang diperlukan untuk membuat tugas dan membaca data, sehingga meminimalkan risiko keamanan.

Membuat akun layanan

Untuk membuat akun layanan dengan peran yang diperlukan, lakukan langkah-langkah berikut:

  1. Jalankan perintah berikut di terminal Cloud Shell:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. Sekarang, tambahkan peran yang diperlukan ke akun layanan yang dibuat pada langkah sebelumnya:
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'

Perintah di atas menggunakan abap-sdk-poc sebagai placeholder untuk Project Google Cloud. Ganti abap-sdk-poc dengan project ID Anda.

  1. Untuk memverifikasi bahwa peran telah ditambahkan, buka halaman IAM. Akun layanan yang Anda buat akan tercantum beserta peran yang telah ditetapkan untuknya.

6. Membuat model BigQuery Machine Learning

Dalam codelab ini, kita akan membuat model k-means untuk mengelompokkan set data penyewaan sepeda di London. Anda dapat menerapkan algoritma k-means untuk mengelompokkan data ke dalam cluster. Tidak seperti supervised machine learning, yang berfokus pada analisis prediktif, unsupervised learning adalah analisis deskriptif. Fokusnya adalah memahami data sehingga Anda dapat membuat keputusan berbasis data.

Membuat set data

Untuk membuat set data BigQuery guna menyimpan model ML Anda, lakukan langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman BigQuery. Buka halaman BigQuery
  2. Di panel Explorer, klik nama project Anda.
  3. Klik 5cf3b742649f1e2c.png View actions > Create dataset.

3fbc072041bfa313.png

  1. Di halaman Create dataset, lakukan hal berikut:
  • Untuk Dataset ID, masukkan bqml_tutorial.
  • Untuk Jenis lokasi, pilih Multi-region, lalu pilih EU (beberapa region di Uni Eropa). Set data publik London Bicycle Hires disimpan di multi-region Uni Eropa. Set data Anda harus berada di lokasi yang sama.
  • Jangan ubah setelan default lainnya, lalu klik Create dataset. Halaman Create dataset.

Membuat model k-means

Setelah set data disiapkan, langkah berikutnya adalah membuat model k-means menggunakan data tersebut. Anda dapat membuat dan melatih model k-means menggunakan pernyataan CREATE MODEL dengan opsi model_type=kmeans.

Untuk menjalankan kueri dan membuat model k-means, lakukan langkah-langkah berikut:

  1. Buka halaman BigQuery. Buka BigQuery
  2. Di panel editor, jalankan pernyataan SQL berikut:
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. Di panel navigasi, di bagian Resource, luaskan nama project Anda, klik bqml_tutorial, lalu klik london_station_clusters.
  2. Klik tab Schema. Skema model mencantumkan tiga atribut stasiun yang digunakan BigQuery ML untuk melakukan pengelompokan. Skema akan terlihat seperti berikut:

5f1feb313bd0f6a5.png

  1. Klik tab Evaluasi. Tab ini menampilkan visualisasi cluster yang diidentifikasi oleh model k-means. Di bagian Fitur numerik, grafik batang menampilkan hingga 10 nilai fitur numerik terpenting untuk setiap sentroid. Anda dapat memilih fitur yang akan divisualisasikan dari menu drop-down.

8f9b53971e33dc08.png

7. Mendapatkan prediksi BigQuery ML menggunakan ABAP SDK untuk Google Cloud

Setelah menyiapkan prasyarat di sisi Google Cloud, Anda siap menyelesaikan langkah-langkah di sistem SAP untuk mendapatkan prediksi dari model ML menggunakan ABAP SDK untuk Google Cloud.

Membuat Konfigurasi Kunci Klien

Untuk konfigurasi terkait autentikasi dan konektivitas, ABAP SDK untuk Google Cloud menggunakan tabel /GOOG/CLIENT_KEY dan /GOOG/SERVIC_MAP.

Untuk mempertahankan konfigurasi di tabel /GOOG/CLIENT_KEY, lakukan langkah-langkah berikut:

  1. Di SAP GUI, masukkan kode transaksi SPRO.
  2. Klik IMG Referensi SAP.
  3. Klik ABAP SDK for Google Cloud > Basic Settings > Configure Client Key

25871e639293b9ee.png

  1. Pertahankan nilai berikut terhadap kolom yang tercantum, biarkan semua kolom lain kosong:

Kolom

Nilai

Google Cloud Key Name

BIGQUERY_ML

Nama Akun Layanan Google Cloud

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

Google Cloud Scope

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

ID Project

abap-sdk-poc

Class Otorisasi

/GOOG/CL_AUTH_GOOGLE

Membuat Laporan ABAP untuk mendapatkan prediksi dari model BigQuery ML

Untuk mem-build Laporan ABAP, lakukan langkah-langkah berikut:

  1. Di SAP GUI, buka kode transaksi SE38 dan buat Program Laporan dengan nama ZDEMO_BIGQUERY_ML_PREDICT.
  2. Di pop-up yang terbuka, berikan detail seperti yang ditunjukkan pada gambar berikut:

4cb32d50427df294.png

  1. Di pop-up berikutnya, pilih Local Object atau berikan nama paket yang sesuai.
  2. Di ABAP Editor, tambahkan kode berikut:
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. Simpan dan aktifkan laporan.
  2. Jalankan laporan (F8).

Jika berhasil dieksekusi, Anda akan melihat output laporan seperti yang ditunjukkan di bawah ini:

739e5685511fc9fc.png

6405542a597ed09f.png

8. Selamat

Anda telah menyelesaikan codelab "Mendapatkan prediksi dari model Machine Learning (ML) BigQuery menggunakan ABAP SDK untuk Google Cloud" dengan sangat baik.

Anda telah berhasil mengambil prediksi model Machine Learning BigQuery, langsung dari dalam sistem SAP Anda. Anda telah membuka tingkat integrasi baru antara ABAP dan Layanan Google Cloud. Perluas pengetahuan Anda dengan codelab ABAP SDK untuk Google Cloud yang menarik lainnya:

  • Menggunakan Translation API dengan ABAP SDK untuk Google Cloud
  • Mengupload objek besar ke bucket Cloud Storage menggunakan chunking
  • Mengambil Kredensial/Rahasia dari Secret Manager dengan ABAP SDK untuk Google Cloud
  • Memanggil Vertex AI test-bison dari ABAP

9. Pembersihan

Jika Anda tidak ingin melanjutkan codelab tambahan yang terkait dengan ABAP SDK untuk Google Cloud, lanjutkan pembersihan.

Menghapus project

  • Hapus project Google Cloud:
gcloud projects delete abap-sdk-poc

Menghapus resource satu per satu

  1. Hapus instance komputasi:
gcloud compute instances delete abap-trial-docker
  1. Hapus aturan firewall:
gcloud compute firewall-rules delete sapmachine
  1. Hapus akun layanan:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com