ABAP SDK for Google Cloud を使用して SAP で BigQuery ML 予測を読み取る

ABAP SDK for Google Cloud を使用して SAP で BigQuery ML の予測を読み取る

この Codelab について

subject最終更新: 7月 30, 2025
account_circle作成者: Ajith Urimajalu

1. はじめに

この Codelab では、BigQuery で ML モデルを作成し、ABAP SDK for Google Cloud を使用してこのモデルから予測を取得します。

次の Google Cloud サービスを利用します。

  • BigQuery
  • Cloud Shell

作成するアプリの概要

次のものを作成します。

  • BigQuery ML(ML)モデル。
  • BigQuery API を呼び出すための BigQuery ジョブユーザーのロールを持つサービス アカウント。
  • BigQuery API を呼び出して ML モデルから予測を取得する ABAP プログラム。

2. 要件

  • ブラウザ(ChromeFirefox など)
  • 課金が有効になっている Google Cloud プロジェクト。または、Google Cloud Platform の90 日間の無料トライアル アカウントを作成します。
  • システムにインストールされている SAP GUI(Windows または Java)。ノートパソコンに SAP GUI がすでにインストールされている場合は、VM の外部 IP アドレスをアプリケーション サーバー IP として使用して SAP に接続します。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
  • ABAP SDK for Google Cloud がインストールされている SAP システムにアクセスできる必要があります。
  • この Codelab に進む前に、Codelab 1(Google Cloud Platform に ABAP Platform Trial 1909 をインストールし、Google Cloud 用 ABAP SDK をインストールする)と Codelab 2(Compute Engine VM でホストされている SAP のトークンを使用して ABAP SDK 認証を構成する)を完了する必要があります。
  • Codelab 1 と Codelab 2 を完了している場合は、Google Cloud 上の ABAP Platform Trial 1909 システムと、認証と接続に必要な設定がプロビジョニングされています。
  • Codelab 1 と Codelab 2 を完了していない場合、この Codelab で提供されている手順を実行するために必要なインフラストラクチャと接続がすべて揃っていないことになります。そのため、この Codelab に進む前に、Codelab 1 と Codelab 2 を完了する必要があります。

4. Google Cloud プロジェクトで BigQuery API V2 を有効にする

  1. Cloud コンソールで、右上にある [Cloud Shell をアクティブにする] をクリックします。

6757b2fb50ddcc2d.png

  1. Cloud Shell で次のコマンドを実行して、BigQuery API を有効にします。
gcloud services enable bigquery.googleapis.com

実行が成功すると、次のようなメッセージが表示されます。

b5f52859df2c2f56.png

これで、Google Cloud プロジェクトで BigQuery API が有効になりました。

5. 安全な BigQuery アクセス用のサービス アカウントを作成する

BigQuery ML モデルから 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'

上記のコマンドでは、Google Cloud プロジェクトのプレースホルダとして abap-sdk-poc を使用しています。abap-sdk-poc は、実際のプロジェクト ID に置き換えます。

  1. ロールが追加されたことを確認するには、[IAM] ページに移動します。作成したサービス アカウントと、そのサービス アカウントに割り当てられたロールが表示されます。

6. BigQuery ML モデルを作成する

この Codelab では、ロンドンのレンタル自転車のデータセットをクラスタ化するための K 平均法モデルを作成します。データをクラスタにグループ化するために K 平均法アルゴリズムを適用することができます。教師あり機械学習が予測分析を目的としているのとは異なり、教師なし学習では記述分析が目的となります。データに基づいて意思決定を下せるように、データを理解することが重要になります。

データセットを作成する

ML モデルを保存する BigQuery データセットを作成する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。[BigQuery] ページに移動
  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。
  3. 5cf3b742649f1e2c.png [アクションを表示] > [データセットを作成] をクリックします。

3fbc072041bfa313.png

  1. [データセットを作成する] ページで、次の操作を行います。
  • [データセット ID] に「bqml_tutorial」と入力します。
  • [ロケーション タイプ] で [マルチリージョン] を選択してから、[EU(欧州連合の複数のリージョン)] を選択します。ロンドンのレンタル自転車の一般公開データセットは、EU マルチリージョンに格納されています。データセットは同じロケーションに存在する必要があります。
  • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。データセットの作成ページ

k 平均法モデルを作成する

データセットの設定が完了したら、次のステップでは、そのデータを使用して K 平均法モデルを作成します。CREATE MODEL ステートメントを model_type=kmeans オプション付きで使用することで、K 平均法モデルの作成とトレーニングが行えます。

クエリを実行して K 平均法モデルを作成する手順は次のとおりです。

  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. [スキーマ] タブをクリックします。モデルのスキーマには、BigQuery ML がクラスタリングを行う際に使用した 3 つのステーション属性が一覧表示されています。スキーマは次のようになります。

5f1feb313bd0f6a5.png

  1. [評価] タブをクリックします。このタブには、K 平均法モデルによって識別されたクラスタが可視化されます。[数値特徴] には、セントロイドごとに最大 10 個の重要な特徴値が棒グラフで表示されます。可視化する特徴をプルダウン メニューから選択できます。

8f9b53971e33dc08.png

7. ABAP SDK for Google Cloud を使用して BigQuery ML の予測を取得する

Google Cloud 側で前提条件を設定したので、ABAP SDK for Google Cloud を使用して ML モデルから予測を取得する手順を SAP システムで完了する準備が整いました。

クライアント キー構成を作成する

認証と接続に関連する構成の場合、ABAP SDK for Google Cloud ではテーブル /GOOG/CLIENT_KEY/GOOG/SERVIC_MAP. が使用されます。

/GOOG/CLIENT_KEY テーブルで構成を維持するには、次の操作を行います。

  1. SAP GUI で、トランザクション コード SPRO を入力します。
  2. [SAP 参照 IMG] をクリックします。
  3. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。

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

プロジェクト ID

abap-sdk-poc

認可クラス

/GOOG/CL_AUTH_GOOGLE

BigQuery ML モデルから予測を取得する ABAP レポートをビルドする

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. 完了

「ABAP SDK for Google Cloud を使用して BigQuery ML モデルから予測を取得する」の Codelab を完了しました。

SAP システム内から BigQuery ML モデルの予測を取得できました。ABAP と Google Cloud サービス間の新しいレベルの統合が実現しました。他の ABAP SDK for Google Cloud Codelabs で、さらに視野を広げましょう。

  • ABAP SDK for Google Cloud で Translation API を使用する
  • チャンクを使用して大きなオブジェクトを Cloud Storage バケットにアップロードする
  • ABAP SDK for Google Cloud を使用して Secret Manager から認証情報/シークレットを取得する
  • ABAP から Vertex AI test-bison を呼び出す

9. クリーンアップ

ABAP SDK for Google Cloud に関連する追加の Codelabs を続行しない場合は、クリーンアップに進んでください。

プロジェクトの削除

  • Google Cloud プロジェクトを削除します。
gcloud projects delete abap-sdk-poc

リソースを個別に削除する

  1. コンピューティング インスタンスを削除します。
gcloud compute instances delete abap-trial-docker
  1. firewall-rules を削除します。
gcloud compute firewall-rules delete sapmachine
  1. サービス アカウントを削除します。
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com