BigQuery 取消嵌套数组 - 获取重复项

Posted

技术标签:

【中文标题】BigQuery 取消嵌套数组 - 获取重复项【英文标题】:BigQuery Unnest an Array - Getting dupliates 【发布时间】:2018-11-19 04:44:25 【问题描述】:

我正在处理 BQ 中的 GCP 结算查询。但是,在使用成本提取数组时,我得到了错误的值,例如 unnest 返回行格式的数组元素。因此,如果我在一个数组中有 2 个元素用于单行,那么我将得到 2 行。

EG:

实际数组:

SELECT

TO_JSON_STRING(labels), cost

FROM

billing_export.gcp_billing_export

WHERE

_PARTITIONTIME >= "2018-08-01 00:00:00"

AND _PARTITIONTIME < "2018-09-01 00:00:00"

AND billing_account_id = "xxx-62378F-xxx"

AND TO_JSON_STRING(labels) = '["key":"application","value":"scaled-server","key":"department","value":"hrd"]'

and cost> 0 limit 10

使用未嵌套:

with cte as (SELECT

labels, cost

FROM

billing_export.gcp_billing_export

WHERE

_PARTITIONTIME >= "2018-08-01 00:00:00"

AND _PARTITIONTIME < "2018-09-01 00:00:00"

AND billing_account_id = "xxx-62378F-xxxx"

AND TO_JSON_STRING(labels) = '["key":"application","value":"scaled-server","key":"department","value":"hrd"]'

and cost> 0

limit 10 )

select labels,cost from cte ,

UNNEST(labels) AS la

问题:

我不想要重复的成本值,有人可以帮我解决这个问题吗?

【问题讨论】:

是的,我已将此标记为答案 :) 刚刚投了赞成票。 谢谢!欣赏它 【参考方案1】:

而不是

SELECT labels,cost from cte ,
UNNEST(labels) AS la   

试试

SELECT la, cost from cte ,
UNNEST(labels) AS la   

更新

SELECT 
  ARRAY(
    SELECT AS STRUCT 
      JSON_EXTRACT_SCALAR(kv, '$.key') key, 
      JSON_EXTRACT_SCALAR(kv, '$.value') value 
    FROM UNNEST(SPLIT(labels, ',')) kv_temp, 
    UNNEST([CONCAT('', REGEXP_REPLACE(kv_temp, r'^\[|]$', ''), '')]) kv
  ) labels,
  cost
FROM cte

【讨论】:

此查询显示,再次重复。以前的结果:imgur.com/tA6vCi3。使用上面的查询:imgur.com/N7e8Hr4。成本字段在两次都是重复的。 我希望,您至少认识到上述答案指出您使用labels 而不是la 的问题之一 - 如果是这种情况 - 考虑投票。同时 - 你能解释一下你期望在哪里看到成本的逻辑,在哪里没有以及为什么 - 所以我们可以帮助你通过 sql 表达这个逻辑 是的,赞成。我在这里解释了完整的要求:reddit.com/r/bigquery/comments/9yd8w2/unnest_an_array 或者我在这里有另一个问题:***.com/questions/53372423/… 不幸的是,目前还不清楚。大多数情况下,看起来您已经将标签作为重复字段,然后您正试图将其“反转”回数组。原因是什么?您应该详细说明您的用例 - 否则只会猜测我们这边 我想获得基于标签的资源计费因此,如果我有 2 个不同的标签,那么在取消嵌套 BQ 时会在第 2 行中提取 2 个标签并为这 2 行添加该资源的成本例如:我有一个标记为env: prod database: mysql 的虚拟机,此虚拟机的总成本为 10 美元,现在实际计费的数据如下所示 第 1 列(标签):["key": "env", "value":"prod","key":"database","value":mysql"] 第 2 列(成本):10 但如果这样做不嵌套select la.key,la.value ,cost from my_tbl , UNNEST(labels) AS la group by la.key,la.value, cost

以上是关于BigQuery 取消嵌套数组 - 获取重复项的主要内容,如果未能解决你的问题,请参考以下文章

在 Power BI 中使用 BigQuery 重复/嵌套字段

如何在存储为字符串的 bigquery 字段中取消嵌套多个数组?

从 BigQuery 中的重复嵌套列中获取参数数组

从BigQuery中重复的嵌套列获取参数数组

在 BigQuery 中取消嵌套多个嵌套字段

BigQuery - 相关子查询取消嵌套数组不起作用