【问题标题】:SQL - Extract JSON from ArraySQL - 从数组中提取 JSON
【发布时间】:2019-04-21 16:22:45
【问题描述】:

我正在使用 Google BigQuery 编写一些查询。我想从数组中提取 JSON。不知何故,我可以提取它。 @Mikhail Berlyant 帮助了我 here。但现在问题在于从没有重复的数组中提取 JSON。

当前结构:

我试过了:

WITH
  cte AS (
  SELECT
    labels,
    cost
  FROM
    BILLING.gcp_billing_export_v1)
SELECT
  la,
  cost
FROM
  cte,
  UNNEST(labels) AS la

查看成本框,COST 值重复了两次,因为我们在数组中有 2 个 KEY, VALUE 对。

因此,在与la.key 的组一起做sum(cost) 时,我得到了错误的值。

我正在寻找的是,

谁能帮我解决这个问题?

【问题讨论】:

  • 所以你只是不想重复成本?
  • 是的汗,我不花钱重复
  • 您的departmenthrd 的键在整个数据集中是统一的吗?
  • 不,它在某些行上具有不同的值。

标签: sql arrays json google-cloud-platform google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  description, 
  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 `project.dataset.table`   

您可以使用以下问题中的虚拟数据摘录来测试和玩上面的内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'aaa' description, '[{"key":"application","value":"scaled-server"},{"key":"department","value":"hrd"}]' labels, 0.323316 cost UNION ALL
  SELECT 'bbb' description, '[{"key":"application2","value":"scaled-server2"},{"key":"department2","value":"hrd2"}]' labels, 0.342825 cost 
)
SELECT 
  description, 
  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 `project.dataset.table`   

结果

Row description labels.key      labels.value    cost     
1   aaa         application     scaled-server   0.323316     
                department      hrd      
2   bbb         application2    scaled-server2  0.342825     
                department2     hrd2         

【讨论】:

  • 感谢您的惊人查询,它可以工作,但是在我的实际数据集上应用相同的查询时,我收到此错误No matching signature for function SPLIT for argument types: ARRAY<STRUCT<key STRING, value STRING>>, STRING. Supported signatures: SPLIT(STRING, [STRING]); SPLIT(BYTES, BYTES) at [20:17]。第 20 行是 ` FROM UNNEST(SPLIT(labels, '},{')) kv_temp, `
  • 在您的问题中您提供了数据示例 - 请参阅Current Structure 部分。所以我的回答是基于你在问题中提供的内容
  • 我使用TO_JSON_STRING(labels) 获取该列。可以吗?
  • 我把它改成了FROM UNNEST(SPLIT(TO_JSON_STRING(labels), '},{')) kv_temp。现在它的工作
  • 我正要为你输入这个:o) - 很高兴你成功了。但是在接下来的问题中,您最好不要混淆数据的架构,这样答案将更加优化并且与您的真实数据/用例相关。同时,考虑接受并投票(如果还没有)
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2021-12-08
  • 2023-04-08
相关资源
最近更新 更多