適用於 ABAP 的 BigQuery AI 和 ML SDK 可讓您將 BigQuery 做為集中式查詢存放區,用於儲存、維護及擷取可透過 ABAP 應用程式執行的查詢。
集中式查詢存放區可為經過驗證且經過最佳化的查詢提供單一來源。BigQuery 是集中式查詢存放區,可供 BigQuery AI 和 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
:您要取得 Gemini 回應的 BigQuery 資料表中不重複的資料表欄位。PROMPT_TEXT
:您要提供給 Gemini 的提示字串。PROJECT_ID_DATASET_TABLE
:BigQuery 資料表,其中包含您要使用 Gemini 搭配傳入提示進行分析的資料。
用於讓 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 CloudQUERY_LOCATION_ID
:查詢儲存的 Google Cloud 位置。SAVED_QUERY_NAME
:在 BigQuery 中儲存查詢時使用的查詢名稱。
類別的參照在例項化後會保留已儲存的查詢文字,並由 ABAP 的 BigQuery AI 和 ML SDK 的其他模組用來參照已儲存的查詢。
您也可以在參數 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
類別參照中的 set 查詢,請使用 /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 CloudQUERY_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 CloudQUERY_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 CloudQUERY_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 CloudQUERY_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 CloudQUERY_LOCATION_ID
:查詢儲存的 Google Cloud 位置。SAVED_QUERY_NAME
:儲存於 BigQuery 的查詢名稱。
LT_PARAMETERS
會保存針對 SAVED_QUERY_NAME
設定的查詢參數。