如何在 bigquery 中取消嵌套结构数组的字符串?
How can I unnest a string of an array of structs in bigquery?
bigquery 方法:INFORMATION_SCHEMA.TABLE_OPTIONS returns option_value 的结构数组字符串,当 option_name 是“标签”时。更多信息在这里:TABLE_OPTIONS 例如,我创建了 table:
CREATE OR REPLACE TABLE sample_dataset.sample_table
OPTIONS(
labels=[("env","dev"),("dep","hr")]
)
然后我从 table 查询:
SELECT * FROM sample_table.INFORMATION_SCHEMA.TABLE_OPTIONS
这个returns以下:
[
{
"table_catalog": "sample_project",
"table_schema": "sample_dataset",
"table_name": "sample_data",
"option_name": "labels",
"option_type": "ARRAY<STRUCT<STRING, STRING>>",
"option_value": "[STRUCT(\"env\", \"dev\"), STRUCT(\"dept\", \"hr\")]"
}
]
我怎样才能将这个 table 转换成更像的东西:
[
{
"table_catalog": "sample_project",
"table_schema": "sample_dataset",
"table_name": "sample_data",
"env": "dev",
"dept":"hr"
}
]
我已经尝试了这个堆栈溢出问题的所有答案,但没有成功:
Stringified array bigquery
考虑以下方法
select table_catalog, table_schema, table_name,
array(
select as struct arr[offset(0)] key, arr[offset(1)] value
from unnest(regexp_extract_all(option_value, r'STRUCT\(("[^"]+", "[^"]+")\)')) kv,
unnest([struct(split(replace(kv, '"', ''), ', ') as arr)])
) options
from sample_dataset.INFORMATION_SCHEMA.TABLE_OPTIONS
where table_name = 'sample_data'
and option_name = 'labels'
如果应用于您问题中的示例用例 - 输出为
@Mikhail_Berlyant 提供的不错的解决方案的另一个选择是在可用时使用 TO_JSON
函数。
自 2022 年 1 月起,JSON
现已成为 BigQuery 支持的数据类型,但尚未正式发布。
当它成为 GA 时(或者如果你足够幸运已经可以访问,我认为可以申请)你可以简单地做:
SELECT * EXCEPT (option_value),
TO_JSON(option_value) AS option_value_json
FROM sample_table.INFORMATION_SCHEMA.TABLE_OPTIONS
并且您将能够使用 BQ JSON 函数非常简单地提取您需要的信息。
bigquery 方法:INFORMATION_SCHEMA.TABLE_OPTIONS returns option_value 的结构数组字符串,当 option_name 是“标签”时。更多信息在这里:TABLE_OPTIONS 例如,我创建了 table:
CREATE OR REPLACE TABLE sample_dataset.sample_table
OPTIONS(
labels=[("env","dev"),("dep","hr")]
)
然后我从 table 查询:
SELECT * FROM sample_table.INFORMATION_SCHEMA.TABLE_OPTIONS
这个returns以下:
[
{
"table_catalog": "sample_project",
"table_schema": "sample_dataset",
"table_name": "sample_data",
"option_name": "labels",
"option_type": "ARRAY<STRUCT<STRING, STRING>>",
"option_value": "[STRUCT(\"env\", \"dev\"), STRUCT(\"dept\", \"hr\")]"
}
]
我怎样才能将这个 table 转换成更像的东西:
[
{
"table_catalog": "sample_project",
"table_schema": "sample_dataset",
"table_name": "sample_data",
"env": "dev",
"dept":"hr"
}
]
我已经尝试了这个堆栈溢出问题的所有答案,但没有成功: Stringified array bigquery
考虑以下方法
select table_catalog, table_schema, table_name,
array(
select as struct arr[offset(0)] key, arr[offset(1)] value
from unnest(regexp_extract_all(option_value, r'STRUCT\(("[^"]+", "[^"]+")\)')) kv,
unnest([struct(split(replace(kv, '"', ''), ', ') as arr)])
) options
from sample_dataset.INFORMATION_SCHEMA.TABLE_OPTIONS
where table_name = 'sample_data'
and option_name = 'labels'
如果应用于您问题中的示例用例 - 输出为
@Mikhail_Berlyant 提供的不错的解决方案的另一个选择是在可用时使用 TO_JSON
函数。
自 2022 年 1 月起,JSON
现已成为 BigQuery 支持的数据类型,但尚未正式发布。
当它成为 GA 时(或者如果你足够幸运已经可以访问,我认为可以申请)你可以简单地做:
SELECT * EXCEPT (option_value),
TO_JSON(option_value) AS option_value_json
FROM sample_table.INFORMATION_SCHEMA.TABLE_OPTIONS
并且您将能够使用 BQ JSON 函数非常简单地提取您需要的信息。