在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?

Posted

技术标签:

【中文标题】在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?【英文标题】:In Bigquery, how can I convert stringified array of struct into a proper array? 【发布时间】:2020-09-11 09:55:40 【问题描述】:

我想将数据集中每个表的标签存储到包含 (table_name, label_name, label_value) 的表中,以便我可以选择带有标签条件的表名(例如,WHERE label_name = 'xxx' and label_value = 'yyy')。

通过这个查询,我可以提取一个字符串化的结构数组,每个都包含标签名称和标签值:

*
FROM `mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS`
WHERE option_name = 'labels'

输出如下所示:

WITH output AS
( 
SELECT "table_name_a" as table_name, "ARRAY<STRUCT<STRING, STRING>>" AS option_type, "[STRUCT(\"label_name_a_1\", \"label_value_a_1\"), STRUCT(\"label_name_a_2\", \"label_value_a_2\"), STRUCT(\"label_name_a_3\", \"label_value_a_3\")]" as option_value
UNION ALL
SELECT "table_name_b" as table_name, "ARRAY<STRUCT<STRING, STRING>>" AS option_type, "[STRUCT(\"label_name_b_1\", \"label_value_b_1\"), STRUCT(\"label_name_b_2\", \"label_value_b_2\"), STRUCT(\"label_name_b_3\", \"label_value_b_3\")]" as option_value
)

SELECT * FROM output

直观的方法是转换为数组并指定结构:

SELECT ARRAY<STRUCT<STRING, STRING>>[STRUCT("label_name_a_1", "label_value_a_1"), STRUCT("label_name_a_2", "label_value_a_2"), STRUCT("label_name_a_3", "label_value_a_3")]

但我无法为每个 option_value 找到“动态”执行此操作的方法

一个非常糟糕的解决方案是转换字符串,然后使用 JSON_EXTRACT,但我认为可能有更好更简单的方法来做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

这是将选项值字符串转换为ARRAY&lt;STRUCT&lt;key STRING, value STRING&gt;&gt;类型的代码示例:

DECLARE optionValue DEFAULT ((select option_value
FROM `zyun.INFORMATION_SCHEMA.TABLE_OPTIONS`
WHERE option_name = 'labels'
  AND table_name = 'test'));

DECLARE label ARRAY<STRUCT<key STRING, value STRING>>;
EXECUTE IMMEDIATE "SELECT ARRAY<STRUCT<key STRING, value STRING>> " || optionValue INTO label;

SELECT label;

输出:

SELECT label; -- at [9:1]
+-----------------------------------------------------------+
|                           label                           |
+-----------------------------------------------------------+
| ["key":"aaa","value":"bbb","key":"ccc","value":"ddd"] |
+-----------------------------------------------------------+

【讨论】:

太棒了!我只需要弄清楚如何在任意数量的表上运行它(目标是安排一个查询,该查询将在一个表中存储数据集中每个表的所有标签和标签值)

以上是关于在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中取消嵌套 JSON 字符串化数组

如何在不破坏我的结构的情况下将特定单元格排除到 BigQuery 中的数组数组中?

BigQuery 中未嵌套的 json 对象的字符串化数组

如何在bigquery中连接两个结构数组?

如何将 BigQuery Struct Schema 字符串转换为 Javascript 对象?

如何将表 1 上的结构数组与 BigQuery 中表 2 的普通列连接起来