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