Интеграция Dialogflow с BigQuery — передача целочисленных параметров в BQ

#google-bigquery #dialogflow-es

#google-bigquery #dialogflow-es

Вопрос:

Я создаю чат-бота, который извлекает данные из BigQuery, но у меня возникают проблемы с типами данных в Dialogflow:

Параметрами Dialogflow являются: рейтинг (@sys.number-int), Страна (строка), Отдел (строка)

Когда я выполняю следующий код, кажется, что bigquery получает рейтинг в виде строки (страна и департамент, которые являются строками, в BigQuery работают нормально), поэтому я пробовал CAST, но безуспешно.

Может ли кто-нибудь помочь мне передать переменные INT64 в BigQuery из Dialogflow?

  function buyAgainPredictor(agent) {
    const OPTIONS = {
                query: 'WITH pred_table AS (SELECT CAST(`request.body.queryResult.outputContexts[0].parameters.Rating´ AS INT64) as Rating, "request.body.queryResult.outputContexts[0].parameters.Department" as Department,  "request.body.queryResult.outputContexts[0].parameters.Country" as Country)'  
                'SELECT cast(predicted_label as INT64) as predicted_label '  
                'FROM ML.PREDICT(MODEL Customer_feedback.recommend_model,  TABLE pred_table)',
                timeoutMs: 10000,
                useLegacySql: false,
                queryParameters: {}
  

Определение параметра DialogFlow

Комментарии:

1. Как вы думаете, почему он получает их в виде строки?

Ответ №1:

Вы не заменяете переменные внутри строки. Попробуйте это в query :

 `WITH pred_table AS (
  SELECT ${request.body.queryResult.outputContexts[0].parameters.Rating} as Rating,
     "${request.body.queryResult.outputContexts[0].parameters.Department}" as Department,
     "${request.body.queryResult.outputContexts[0].parameters.Country}" as Country)

SELECT cast(predicted_label as INT64) as predicted_label 
     FROM ML.PREDICT(MODEL Customer_feedback.recommend_model, TABLE pred_table)`

  

Обычно вы не хотели бы использовать пользовательский ввод в своих SQL-запросах (SQL-инъекция), проверьте документацию по параметризованным запросам. Принимая это во внимание, вы могли бы попробовать это:

 const OPTIONS = {
    query: `WITH pred_table AS (
                SELECT @rating as Rating,
                       @department as Department,  
                       @country as Country)

            SELECT cast(predicted_label as INT64) as predicted_label
                 FROM ML.PREDICT(MODEL Customer_feedback.recommend_model, TABLE pred_table)`,

    timeoutMs: 10000,
    useLegacySql: false,
    queryParameters: {
        rating: parameters.Rating,
        department: parameters.Department,
        country: parameters.Country
    }
}