【发布时间】:2020-03-19 14:06:41
【问题描述】:
我有一个由这个 JSON 表示的 BigQuery 表(重复记录)
{
"createdBy": [
"foo",
"foo"
],
"fileName": [
"bar1",
"bar2"
]
}
我需要转换成重复记录
[
{
"createdBy": "foo",
"fileName": "bar1"
},
{
"createdBy": "foo",
"fileName": "bar2"
}
]
为了进行这种转换,您为每个数组使用索引 0 并创建第一个对象,为第二个对象使用 1 索引,...
我使用 UDF 执行了这种转换,但问题是由于 BigQuery 限制我无法保存执行这种转换的 VIEW:
No support for CREATE TEMPORARY FUNCTION statements inside views
按照完整语句生成示例表和函数
CREATE TEMP FUNCTION filesObjectArrayToArrayObject(filesJson STRING)
RETURNS ARRAY<STRUCT<createdBy STRING, fileName STRING>>
LANGUAGE js AS """
function filesObjectArrayToArrayObject_execute(files) {
var createdBy = files["createdBy"];
var fileName = files["fileName"];
var output = [];
for(var i=0 ; i<createdBy.length ; i++) {
output.push({ "createdBy" : createdBy[i], "fileName" : fileName[i] });
}
return output;
}
return filesObjectArrayToArrayObject_execute(JSON.parse(filesJson));
""";
WITH sample_table AS (
SELECT STRUCT<createdBy ARRAY<STRING>, fileName ARRAY<STRING>>(
["foo", "foo"],
["bar1", "bar2"]
) AS files
)
SELECT
files AS filesOriginal,
filesObjectArrayToArrayObject(TO_JSON_STRING(files)) AS filesConverted
FROM sample_table
有没有办法使用原生 BigQuery 语句执行相同类型的任务?
请注意:
- 真实数据有超过 2 个键,但名称是固定的
- 数组的长度不固定,可以是0,1,10,20,...
【问题讨论】:
标签: google-bigquery