Как преобразовать массив в строковое значение - PullRequest
0 голосов
/ 06 февраля 2019

Здравствуйте, я пытаюсь получить стоимость журнала запросов, я получаю общую сумму, но когда я пытаюсь разбить ее на набор данных, я получаю эту ошибку:

'Невозможно получить доступ к полю datasetId для значения с типомARRAY> at '

это мой запрос, который я пытаюсь выполнить:

WITH
  data AS (
  SELECT
    protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent AS jobCompletedEvent,
    (
    SELECT
      ARRAY_TO_STRING((
        SELECT
          ARRAY_AGG(datasetId)
        FROM
          UNNEST(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables.datasetId) ))) AS datasetIds
  FROM
    `kkk111.bq_audit_log_export.cloudaudit_googleapis_com_data_access_20190206` )
SELECT
  datasetIds,
  FORMAT('%9.2f',5.0 * (SUM(jobCompletedEvent.job.jobStatistics.totalBilledBytes)/POWER(2, 40))) AS Estimated_USD_Cost
FROM
  data
WHERE
  jobCompletedEvent.eventName = 'query_job_completed'
GROUP BY
  datasetIds
ORDER BY
  Estimated_USD_Cost DESC

Я использую стандартный SQL-диалект
как мне привести это поле:

protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables.datasetId

из массива в строку?что мне не хватает?Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL   
WITH data AS (
  SELECT 
    protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent AS jobCompletedEvent,
    ref.datasetId AS datasetId
  FROM `kkk111.bq_audit_log_export.cloudaudit_googleapis_com_data_access_20190206`,
  UNNEST(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables) ref 
)
SELECT
  datasetId,
  FORMAT('%9.2f',5.0 * (SUM(jobCompletedEvent.job.jobStatistics.totalBilledBytes)/POWER(2, 40))) AS Estimated_USD_Cost
FROM data
WHERE jobCompletedEvent.eventName = 'query_job_completed'
GROUP BY datasetId
ORDER BY Estimated_USD_Cost DESC   

Как вы можете видеть там, очевидно, что вам нужно UNNEST referencedTables ARRAY, но также вы должны убедиться, что ваш окончательный расчет стоимости настолько близок к правильному, наскольковозможный.Один и тот же запрос может ссылаться на несколько таблиц из одного и того же набора данных, поэтому вам лучше иметь DISTINCT в вашем CTE.Но также, один и тот же запрос может ссылаться на таблицы из нескольких наборов данных - поэтому в этом же биллинге байты будут отнесены к нескольким наборам данных, поэтому вы будете иметь завышенную оценку!Я не знаю вашего точного намерения - но вы можете ввести некоторую логику для распределения стоимости между ссылочными наборами данных.

0 голосов
/ 06 февраля 2019

Вам нужно UNNEST внешнего массива, чтобы выбрать ID набора данных внутри:

SELECT
  ARRAY_TO_STRING((
    SELECT ARRAY_AGG(datasetId)
    FROM UNNEST(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables)
    ), ',') AS datasetIds
FROM ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...