如何在 BigQuery 中将结构插入(或修改)到 ARRAY<STRUCT<STRING, STRUCT>>?

Posted

技术标签:

【中文标题】如何在 BigQuery 中将结构插入(或修改)到 ARRAY<STRUCT<STRING, STRUCT>>?【英文标题】:How can i insert(or modify) struct to ARRAY<STRUCT<STRING, STRUCT>> in BigQuery? 【发布时间】:2021-02-16 11:28:42 【问题描述】:

记录“event_params”是结构数组 而且values也是struct,event_params的结构类型是

ARRAY<STRUCT<STRING, STRUCT(string_value, int_value, float_value, double_value)>

我想将结构(或修改)添加到 BigQuery 表中的 ARRAY>。

问题 1

这是解决问题的表

这就是我想要的。

这些查询无效

ARRAY_CONCAT(event_params, [(new_data_key, new_input_data_value, null, null, nul)]

ARRAY_CONCAT(event_params, [(new_data_key, (new_input_data_value, null, null, nul))]

错误信息是

No matching signature for function ARRAY_CONCAT for argument types: ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>>, ARRAY<STRUCT<STRING, STRING, INT64, ...>>. Supported signature: ARRAY_CONCAT(ARRAY, [ARRAY, ...])

谁能告诉我回答问题?

提前感谢您的回复。

问题 2(未解决)

是否可以更改 ARRAY 中的数据?

ex) [根据原文图 1] 更改 event_params.key 和 event_params.value.int_value

# value.string_value
k6(original) -> k7 (what i want just change k6 -> k6-1)

# value.int_value
1(original) -> 3 (what i want is original * 3)

我使用 UNNEST 行处理了这个问题,然后再次对它们进行 NEST。 (我觉得很长,不好回答)

【问题讨论】:

【参考方案1】:

您必须更新整个数组字段。使用ARRAY_CONCAT:

update my_dataset.my_table
set event_params = ARRAY_CONCAT(
  event_params,
  [(new_data_key, (new_input_data_value, null, null, nul))]
)

明确指定类型会有所帮助:

update my_dataset.my_table
set event_params = ARRAY_CONCAT(
  event_params,
  ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64>>>[(new_data_key, (new_input_data_value, null, null, nul))]
)

【讨论】:

它没有用。因为列 (event_params.values.xxx) 是 STRUCT。错误消息是“参数类型的函数 ARRAY_CONCAT 没有匹配签名:ARRAY>>, ARRAY>. 支持的签名:ARRAY_CONCAT(ARRAY, [ARRAY, ...])"。我认为答案查询更复杂。谢谢! 抱歉,已更新。如果有任何错误消息,请发布。 成功了,你是我的英雄!杰龙。我可以问更多问题吗?我更新了,请注意我的问题 2。非常感谢! 更新数组中的元素不太方便,因为它不是 BigQuery 的常见用例。如果您需要进行大量更新,请考虑改用 BigTable。但也许有人知道比 unnest-nest 更漂亮的方法。尝试提出一个新问题(很少有人会查看已回答的问题)。 知道了,谢谢你的帮助!祝你有美好的一天:)

以上是关于如何在 BigQuery 中将结构插入(或修改)到 ARRAY<STRUCT<STRING, STRUCT>>?的主要内容,如果未能解决你的问题,请参考以下文章

使用云功能从云存储中将数据加载到BigQuery中(替代功能?)

如何在 node.js 环境中将查询语句传递给 bigquery

如何在新的 bigquery 项目中将表复制到空数据集?

Google Cloud Data Fusion,如何在一个管道中将多个表加载到 bigquery

在 BigQuery 中将列转换为数组

如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格