在 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<STRUCT<key STRING, value STRING>>
类型的代码示例:
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 中的数组数组中?