在 BigQuery 中存储和管理企业查询

借助 BigQuery AI and ML SDK for ABAP,您可以将 BigQuery 用作集中式查询存储库,以存储、维护和检索您可从 ABAP 应用运行的查询。

集中式查询库为经过验证和优化的查询提供了单一可信来源。BigQuery 作为集中式查询存储库,可供 BigQuery AI and ML SDK for ABAP 的不同模块使用,以检索和运行已保存的查询。

如需详细了解 BigQuery 中的保存的查询,请参阅保存的查询简介

准备工作

在将 BigQuery 用作集中式查询存储库之前,请确保您或您的管理员已满足以下前提条件:

在 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 设置的查询参数。