根据另一列中的值更新 BigQuery 中的嵌套数组

Posted

技术标签:

【中文标题】根据另一列中的值更新 BigQuery 中的嵌套数组【英文标题】:Updating nested array in BigQuery based on value in another column 【发布时间】:2020-01-20 11:18:05 【问题描述】:

我对 BigQuery 语法有一个问题,我有点卡住了。我在一个表中有一个条目,它有多个键值对作为数组,当键是某个值时,我想只更新值中的一个特定字符串。

这里是条目

[
  
    "event_params": [
      
        "key": "programType",
        "value": 
          "string_value": "custom",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "firebase_event_origin",
        "value": 
          "string_value": "app",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "firebase_screen_id",
        "value": 
          "string_value": null,
          "int_value": "5",
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "programName",
        "value": 
          "string_value": "overwrite_me",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      
    ]
  
]

我想保持一切不变,除非“key”=“programName”我想用新字符串“anonymous”覆盖 string_value“overwrite_me”。一般来说, string_value 是一些任意字符串,我只想用相同的值覆盖它。

根据here 和here 的几个答案,我尝试了以下查询(以及它的各种排列)

SET
event_params = ARRAY(
   SELECT AS STRUCT * REPLACE(
     CASE WHEN event_param.key = 'programName' THEN
      ((SELECT AS STRUCT value.* REPLACE('anonymous' AS string_value)) AS value)
    END
  ) 
  FROM UNNEST(event_params) as event_param 
)

但 BigQuqery 总是给我语法错误,特别是“语法错误:预期的“)”但在 [9:73] 得到关键字 AS”。我不太确定我做错了什么,我很困惑。

【问题讨论】:

您在使用 SET 方法之前是否声明了您的数组?另外,您遇到了哪些错误? 是的,所有的数组都被声明了。我排除了获取表中所有条目的代码。这些错误是语法错误之间的混合,例如“语法错误:预期的“)”但得到了关键字 AS”,我不太明白为什么语法错误,其他时候(不是上面的代码)我得到“错误: 无法访问类型为 ARRAY 的值的字段名称 我正在调查,我会尽快回复您。 这几天让我很困惑。我和我的同事想出的一种解决方案是手动重建结构,它可以工作,但它会弄乱列名,这没有帮助。 This solution 一个非常相似的相关问题会起作用,除了这里我们有键值对,这不是这个解决方案所提供的,我只是无法让它与连接一起工作。 我正在尝试使用具有类似结构的公共数据集来重现它。这就是为什么我要花一点时间来弄清楚它。我看到你写的例子,确实有点不同,我还在研究中,我会告诉你的。 【参考方案1】:

以下是 BigQuery 标准 SQL

查看非常您的代码的更正版本

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN event_param.key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params) AS event_param 
)

另外,请注意 - 您可以删除对 event_param 的引用,如下例所示

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params)  
)

【讨论】:

啊完美!这正是我正在寻找的。非常感谢。

以上是关于根据另一列中的值更新 BigQuery 中的嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

如何根据bigquery中另一列中的重复值计算一列

Kendo UI:更新一列数据以更改另一列中的值

根据另一列中的值比较一列中的两个值

根据另一列中的值从一列中减去值(SQL)

PSQL - 查找所有值并根据另一列中的非唯一值使其唯一

在 pandas 中,如何根据一列中的唯一值创建列,然后根据另一列中的值填充它?