1. 简介
在此 Codelab 中,您将在 BigQuery 中创建一个机器学习 (ML) 模型,并使用 ABAP SDK for Google Cloud 从该模型中获取预测结果。
您将利用以下 Google Cloud 服务:
- BigQuery
- Cloud Shell
构建内容
您将创建以下内容:
- BigQuery Machine Learning (ML) 模型。
- 具有 BigQuery Job User 角色的服务账号,用于调用 BigQuery API。
- 用于调用 BigQuery API 并从机器学习模型获取预测结果的 ABAP 程序。
2. 要求
- 一个浏览器,例如 Chrome 或 Firefox。
- 已启用结算功能的 Google Cloud 项目,或创建 Google Cloud Platform 90 天免费试用账号。
- 您的系统中已安装 SAP GUI(Windows 或 Java)。如果您的笔记本电脑上已安装 SAP GUI,请使用虚拟机的外部 IP 地址作为应用服务器 IP 连接到 SAP。如果您使用的是 Mac,还可以安装 此链接中提供的 SAP GUI for Java。
3. 准备工作
- 在 Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目(例如:
abap-sdk-poc)。 - 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。如果您使用的是90 天免费试用账号,请跳过此步骤。
- 您将使用 Cloud Shell,它是在 Google Cloud 中运行的命令行环境。
- 在 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
- 您必须有权访问安装了 ABAP SDK for Google Cloud 的 SAP 系统。
- 在继续学习此 Codelab 之前,您必须先完成 Codelab 1(在 Google Cloud Platform 上安装 ABAP 平台试用版 1909 并安装 ABAP SDK for Google Cloud)和 Codelab 2(使用令牌为托管在 Compute Engine 虚拟机上的 SAP 配置 ABAP SDK 身份验证)。
- 如果您已完成 Codelab 1 和 Codelab 2,那么您应该已在 Google Cloud 上预配了 ABAP 平台试用版 1909 系统,并完成了身份验证和连接所需的设置。
- 如果您尚未完成 Codelab 1 和 Codelab 2,则不具备执行本 Codelab 中提供的步骤所需的所有基础设施和连接。因此,您必须先完成 Codelab 1 和 Codelab 2,然后才能继续学习本 Codelab。
4. 在 Google Cloud 项目中启用 BigQuery API V2
- 在 Cloud 控制台中,点击右上角的激活 Cloud Shell:

- 在 Cloud Shell 中运行以下命令以启用 BigQuery API:
gcloud services enable bigquery.googleapis.com
成功执行后,您应该会看到如下所示的消息

现在,您应该已在 Google Cloud 项目中启用 BigQuery API。
5. 创建服务账号以实现安全的 BigQuery 访问
如需安全地从 BigQuery ML 模型获取机器学习预测结果,您需要创建一个具有 BigQuery Job User 和 BigQuery Data Viewer 角色的服务账号,以便您的程序能够在项目中运行查询(作为作业)并从表中读取数据。此角色仅授予创建作业和读取数据所需的权限,从而最大限度地降低安全风险。
创建服务账号
如需创建具有所需角色的服务账号,请执行以下步骤:
- 在 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 替换为您的项目 ID。
- 如需验证角色是否已添加,请前往 IAM 页面。您创建的服务账号应会列出,并显示已为其分配的角色。
6. 创建 BigQuery Machine Learning 模型
在此 Codelab 中,我们将创建一个 k-means 模型,以对伦敦自行车租赁数据集进行聚类。您可以应用 k-means 算法,将数据按聚类进行分组。监督式机器学习与预测分析有关,与此不同的是,非监督式学习与描述性分析有关。您需要理解数据,以便作出数据驱动型决策。
创建数据集
如需创建 BigQuery 数据集以存储机器学习模型,请执行以下步骤:
- 在 Google Cloud 控制台中,前往 BigQuery 页面。转到 BigQuery 页面
- 在探索器窗格中,点击您的项目名称。
- 点击
查看操作 > 创建数据集。

- 在 创建数据集 页面上,执行以下操作:
- 在数据集 ID 部分,输入
bqml_tutorial。 - 在位置类型部分,选择多区域,然后选择 EU (multiple regions in European Union)(欧盟 [欧盟的多个区域])。伦敦自行车租赁公共数据集存储在欧盟多区域。数据集必须位于同一位置。
- 保持其余默认设置不变,然后点击创建数据集。

创建 k-means 模型
现在,您已设置好数据集,下一步是使用数据创建 k-means 模型。您可以使用包含选项 model_type=kmeans 的 CREATE MODEL 语句创建和训练 k-means 模型。
如需运行查询并创建 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。
- 点击架构标签页。模型架构列出了 BigQuery ML 用于执行聚类的 3 个车站特性。架构应如下所示:

- 点击评估标签页。此标签页显示 k-means 模型标识的聚簇的可视化。在数值特征下,条形图最多显示每个形心的 10 个最重要的数值特征值。您可以从下拉菜单中选择要可视化的特征。

7. 使用 ABAP SDK for Google Cloud 获取 BigQuery ML 预测
现在,您已在 Google Cloud 端设置了前提条件,接下来可以完成 SAP 系统中的步骤,以使用 ABAP SDK for Google Cloud 从机器学习模型获取预测结果。
创建客户端密钥配置
对于与身份验证和连接相关的配置,ABAP SDK for Google Cloud 使用表 /GOOG/CLIENT_KEY 和 /GOOG/SERVIC_MAP.
如需维护 /GOOG/CLIENT_KEY 表中的配置,请执行以下步骤:
- 在 SAP GUI 中,输入事务代码 SPRO。
- 点击 SAP 参考 IMG。
- 点击 ABAP SDK for 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 |
项目 ID | 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. 恭喜
恭喜您顺利完成“使用 ABAP SDK for Google Cloud 从 BigQuery Machine Learning (ML) 模型获取预测结果”Codelab!
您已成功从 SAP 系统中直接检索到 BigQuery Machine Learning 模型的预测结果!您已解锁 ABAP 与 Google Cloud 服务之间的新集成级别。通过其他精彩的 ABAP SDK for Google Cloud Codelab 拓展视野:
- 使用 ABAP SDK for Google Cloud 调用 Translation API
- 使用分块将大型对象上传到 Cloud Storage 存储桶
- 使用 ABAP SDK for Google Cloud 从 Secret Manager 检索凭据/Secret
- 从 ABAP 调用 Vertex AI test-bison
9. 清理
如果您不想继续学习与 ABAP SDK for Google Cloud 相关的其他 Codelab,请继续执行清理操作。
删除项目
- 删除 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