【问题标题】:How to convert array to string value如何将数组转换为字符串值
【发布时间】:2019-02-07 00:56:47
【问题描述】:

您好,我正在尝试获取我的查询日志成本,我得到了总量,但是当我尝试按数据集分解它时,我得到了这个错误:

' 无法在 '

处访问类型为 ARRAY> 的值的字段 datasetId

这是我正在尝试运行的查询:

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

从数组到字符串? 我错过了什么? 谢谢。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 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 引用的表数组,但您还需要确保您的最终计算成本尽可能接近正确的计算。同一个查询可以引用同一个数据集中的多个表,因此最好在 CTE 中使用 DISTINCT。而且,相同的查询可以引用来自多个数据集的表 - 所以在这个相同的计费字节将归因于多个数据集,所以你会高估!我不知道您的确切意图 - 但您可能想要引入一些逻辑来在引用的数据集之间分配成本。

    【讨论】:

    • #Mikhail Berlyant,感谢您的帮助,我收到此错误:STRUCT 类型的列 jobCompletedEvent 无法在 SELECT DISTINCT 中使用。关于表格参考它很好,因为我将它保存在每个客户单独的数据集中,所以不用担心,
    • 哈利路亚兄弟!! 8小时调试即!终于工作了!非常感谢老兄。非常感谢!
    【解决方案2】:

    您需要 UNNEST 外部数组才能选择内部的数据集 ID:

    SELECT
      ARRAY_TO_STRING((
        SELECT ARRAY_AGG(datasetId)
        FROM UNNEST(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables)
        ), ',') AS datasetIds
    FROM ...
    

    【讨论】:

    • #Elliott Brossard,我厌倦了你的回答(我编辑了我的问题),但我仍然得到:无法访问 ARRAY 类型的值上的字段 datasetId>
    • 我的答案有一个小错误;我的意思是从路径中省略datasetId。再试一次。
    • 我更改为:FROM UNNEST(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.referencedTables))) AS datasetIds ... 错误返回:对于参数类型:ARRAY 的函数 ARRAY_TO_STRING 没有匹配的签名。支持的签名:ARRAY_TO_STRING(ARRAY, STRING, [STRING]); ARRAY_TO_STRING(ARRAY, BYTES, [BYTES])
    • 看起来 Mikhail 帮您找到了答案,但这里的问题是 ARRAY_TO_STRING 函数需要第二个参数(分隔符)。
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多