借助 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 环境中安装了 BigQuery AI and ML SDK for ABAP。
在 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
设置的查询参数。