借助 BigQuery AI and ML SDK for ABAP,您可以将 BigQuery 用作集中式查询库,以存储、维护和检索可从 ABAP 应用运行的查询。
集中式查询库可提供经过验证和优化的查询,作为单一可信来源。BigQuery 作为集中式查询库,可供 BigQuery AI and ML SDK for ABAP 的各模块使用,以检索和运行保存的查询。
如需详细了解 BigQuery 中的保存的查询,请参阅保存的查询简介。
准备工作
在将 BigQuery 用作集中式查询库之前,请确保您或您的管理员已满足以下前提条件:
- 在 Google Cloud 项目中启用了 BigQuery API。如需了解如何启用 Google Cloud API,请参阅启用 API。
- 在您的 Google Cloud 项目中启用了 BigQuery Studio。
- 您拥有创建和保存查询所需的角色。
- 您的 Google Cloud 项目已启用结算功能。
- 在 SAP 环境中安装了适用于 ABAP 的 BigQuery AI 和 ML SDK。
在 BigQuery 中创建企业查询
如需在 BigQuery 中草拟、验证和保存查询,请使用 BigQuery Studio。如需了解如何在 BigQuery Studio 中创建查询,请参阅创建保存的查询。查询会根据查询名称和位置保存在您的 Google Cloud 项目中。
您还可以与其他用户共享查询。如需详细了解如何与用户共享保存的查询,请参阅共享保存的查询。
查询示例
以下查询示例展示了如何构建查询。
用于调用 Gemini 模型的查询
SELECT *
FROM ML.GENERATE_TEXT(MODEL `PROJECT_ID_DATASET_GEMINI_MODEL`,
(SELECT `UNIQUE_TABLE_FIELD` AS id,
'PROMPT_TEXT' AS prompt
FROM `PROJECT_ID_DATASET_TABLE`),
STRUCT( <Temperature> AS temperature,
<Top_P> AS top_p,
<Top_K> AS top_k,
<Max Output Token> AS max_output_tokens,
<Is Flatten JSON Output> AS flatten_json_output,
<Stop Sequences[]> AS stop_sequences,
<Ground with Google Search> AS ground_with_google_search,
<Safety Settings[]> AS safety_settings ) );
替换以下内容:
PROJECT_ID_DATASET_GEMINI_MODEL
:在您的 Google Cloud 项目中创建的 Gemini 远程模型,以项目 ID 和 BigQuery 数据集作为其前缀。UNIQUE_TABLE_FIELD
:指定您要根据 BigQuery 表中的哪个唯一表字段来获取 Gemini 回答。PROMPT_TEXT
:您要提供给 Gemini 的提示字符串。PROJECT_ID_DATASET_TABLE
:包含您要根据所传递的提示使用 Gemini 分析的数据的 BigQuery 表。
用于更新 BigQuery 向量数据库的查询
CREATE OR REPLACE TABLE `PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE` AS (
SELECT id, content, ml_generate_embedding_result AS embedding
FROM ML.GENERATE_EMBEDDING(
MODEL `PROJECT_ID_DATASET_EMBEDDING_MODEL`,
( SELECT `TABLE_FIELD_NAME_WHICH_HAS_THE_TEXT` AS content,
`<Unique Table Field>` as id
FROM `PROJECT_ID_DATASET_TABLE` ),
STRUCT( <Is Flatten JSON Output> AS flatten_json_output,
<Task Type> as task_type,
<Output Dimensionality> as output_dimensionality )));
替换以下内容:
PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE
:用于存储最新企业数据嵌入的 BigQuery 向量数据库表。PROJECT_ID_DATASET_EMBEDDING_MODEL
:在您的 Google Cloud 项目中创建的 Gemini 远程模型,以项目 ID 和 BigQuery 数据集作为其前缀。TABLE_FIELD_NAME_WHICH_HAS_THE_TEXT
:包含要为其生成嵌入的数据的 BigQuery 表字段名称。UNIQUE_TABLE_FIELD
:指定您要为 BigQuery 表中的哪个唯一表字段将嵌入保存到 BigQuery 向量数据库表中。PROJECT_ID_DATASET_TABLE
:包含要为其生成嵌入的数据的 BigQuery 表。
用于执行向量搜索的查询
DECLARE search_query STRING DEFAULT SEARCH_STRING;
SELECT *
FROM VECTOR_SEARCH(
TABLE `PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE`, 'embedding',
(
SELECT ml_generate_embedding_result, content AS query
FROM ML.GENERATE_EMBEDDING(
MODEL `PROJECT_ID_DATASET_EMBEDDING_MODEL`,
(SELECT search_query AS content))
), top_k => <number of nearest neighbors to return> );
替换以下内容:
SEARCH_STRING
:指定您要参照哪个基于自然语言的搜索字符串从 BigQuery 向量数据库中查找类似项。您还可以为此字段设置一个命名参数,并使用 SDK 通过 ABAP 应用逻辑将该搜索字符串作为查询参数传递。PROJECT_ID_DATASET_BQ_VECTOR_DB_TABLE
:包含嵌入的 BigQuery 向量数据库表名称,以项目 ID 和 BigQuery 数据集作为其前缀。PROJECT_ID_DATASET_EMBEDDING_MODEL
:在您的 Google Cloud 项目中创建的 Gemini 远程模型,以项目 ID 和 BigQuery 数据集作为其前缀。
从 BigQuery 检索企业查询
如需检索在 BigQuery 中保存的查询,请使用 ABAP 类 /GOOG/CL_BQ_QUERY
。该类在内部使用 Dataform API 来检索保存的查询,以便 SDK 的其他模块使用这些查询。
实例化类
使用客户端密钥名称和查询位置实例化该类。
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:用于在 BigQuery 中保存查询的查询的名称。
该类的引用在实例化后会保留保存的查询文本,以便 BigQuery AI and ML SDK for ABAP 的其他模块用来引用保存的查询。
您还可以通过参数 IV_QUERY_TEXT
下的程序逻辑将查询作为查询文本传递。
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_text = 'QUERY_TEXT' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换设置的查询
如需使用其他查询替换类 /GOOG/CL_BQ_QUERY
的引用中设置的查询,请使用类 /GOOG/CL_BQ_QUERY
的方法 SET_QUERY
。这将替换实例化类时设置的查询。
可以通过传递 BigQuery 中所保存查询的名称或通过程序逻辑传递查询文本来进行替换。
使用所保存查询的名称进行替换
lo_bq_query->set_query( iv_query_name = 'QUERY_NAME' ).
使用查询文本进行替换
lo_bq_query->set_query( iv_query_text = 'QUERY_TEXT' ).
设置查询参数
如需为保存在 BigQuery 中的参数化查询传递命名参数,请使用类 /GOOG/CL_BQ_QUERY
的方法 SET_QUERY_PARAMETERS
。这些参数的参数名称与保存的查询中定义的名称相同。在运行时,可以使用此方法通过应用逻辑传递参数名称对应的参数值。
DATA lt_query_parameters TYPE /goog/cl_bq_query=>ty_t_query_parameters.
<Prepare lt_query_parameters>
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
传递基于值的参数
如需传递基于值的参数以及参数名称和类型,请使用类 /GOOG/CL_BQ_QUERY
的方法 SET_QUERY_PARAMETERS
。
DATA lt_query_parameters TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter TYPE /goog/cl_bq_query=>ty_query_parameter.
ls_query_parameter-parameter_name = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'PARAMETER_TYPE'.
ls_query_parameter-parameter_value = 'PARAMETER_VALUE'.
APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
PARAMETER_NAME
:保存的查询中作为命名参数定义的参数的名称。PARAMETER_TYPE
:参数的有效数据类型。PARAMETER_VALUE
:以字符串形式表示的值。CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:用于在 BigQuery 中保存查询的查询的名称。
传递基于数组的参数
如需传递基于数组的参数以及参数名称和数组值,请使用类 /GOOG/CL_BQ_QUERY
的方法 SET_QUERY_PARAMETERS
。
DATA lt_query_parameters TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter TYPE /goog/cl_bq_query=>ty_query_parameter.
ls_query_parameter-parameter_name = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'ARRAY'.
ls_query_parameter-array_type = 'ARRAY_TYPE'.
APPEND 'ARRAY_VALUE' TO ls_query_parameter-array_values.
APPEND 'ARRAY_VALUE' TO ls_query_parameter-array_values.
APPEND....
APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
PARAMETER_NAME
:保存的查询中作为命名参数定义的参数的名称。ARRAY_TYPE
:有效的数组数据类型。ARRAY_VALUE
:数组的值,以字符串形式表示。CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:用于在 BigQuery 中保存查询的查询的名称。
传递基于结构体的参数
如需传递基于结构体的参数以及结构体字段名称、结构体字段类型和结构体字段值,请使用类 /GOOG/CL_BQ_QUERY
的方法 SET_QUERY_PARAMETERS
。
DATA lt_query_parameters TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter TYPE /goog/cl_bq_query=>ty_query_parameter,
DATA ls_struct_values TYPE /goog/cl_bq_query=>ty_struct_values.
ls_query_parameter-parameter_name = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'STRUCT'.
ls_struct_values-field_name = 'STRUCT_FIELD_NAME'.
ls_struct_values-field_type = 'STRUCT_FIELD_TYPE'.
ls_struct_values-field_value = 'STRUCT_FIELD_VALUE'.
APPEND ls_struct_values TO ls_query_parameter-struct_values.
CLEAR ls_struct_values.
....
APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
PARAMETER_NAME
:保存的查询中作为命名参数定义的参数的名称。STRUCT_FIELD_NAME
:结构体的字段名称。STRUCT_FIELD_TYPE
:有效的结构体数据类型。STRUCT_FIELD_VALUE
:结构体字段的值,以字符串形式表示。CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:用于在 BigQuery 中保存查询的查询的名称。
获取查询文本
如需提取保存在 BigQuery 中的查询的查询文本,请使用类 /GOOG/CL_BQ_QUERY
的方法 GET_QUERY_TEXT
。
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
DATA(lv_query_text) = lo_bq_query->get_query_text( ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:用于在 BigQuery 中保存查询的查询的名称。
LV_QUERY_TEXT
包含针对 SAVED_QUERY_NAME
维护的查询。
获取查询参数
如需提取通过 SDK 方法 SET_QUERY_PARAMETERS
设置的查询参数,请使用类 /GOOG/CL_BQ_QUERY
的方法 GET_QUERY_PARAMETERS
。
DATA lt_query_parameters TYPE /goog/cl_bq_query=>ty_t_query_parameters,
DATA ls_query_parameter TYPE /goog/cl_bq_query=>ty_query_parameter.
ls_query_parameter-parameter_name = 'PARAMETER_NAME'.
ls_query_parameter-parameter_type = 'PARAMETER_TYPE'.
ls_query_parameter-parameter_value = 'PARAMETER_VALUE'.
APPEND ls_query_parameter TO lt_query_parameters.
CLEAR ls_query_parameter.
TRY.
DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key = 'CLIENT_KEY'
iv_location_id = 'QUERY_LOCATION_ID'
iv_query_name = 'SAVED_QUERY_NAME' ).
lo_bq_query->set_query_parameters( it_query_parameters = lt_query_patameters ).
DATA(lt_parameters) = lo_bq_query->get_query_parameters( ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
替换以下内容:
PARAMETER_NAME
:保存的查询中作为命名参数定义的参数的名称。PARAMETER_TYPE
:参数的有效数据类型。PARAMETER_VALUE
:以字符串形式表示的值。CLIENT_KEY
:您在身份验证设置期间为了向 Google Cloud 进行身份验证而配置的客户端密钥。QUERY_LOCATION_ID
:保存查询的 Google Cloud 位置。SAVED_QUERY_NAME
:在 BigQuery 中保存查询时所用的查询名称。
LT_PARAMETERS
包含针对 SAVED_QUERY_NAME
设置的查询参数。