Google bigquery 嵌套重复上的bigquery连接
我在连接重复的嵌套字段时遇到问题,同时仍然保留BigQuery中的原始行结构 在我的示例中,我将调用正在连接的两个表Google bigquery 嵌套重复上的bigquery连接,google-bigquery,google-cloud-platform,Google Bigquery,Google Cloud Platform,我在连接重复的嵌套字段时遇到问题,同时仍然保留BigQuery中的原始行结构 在我的示例中,我将调用正在连接的两个表A和B 表A中的记录类似于: { "url":"some url", "repeated_nested": [ {"key":"some key","property":"some property"} ] } { "key":"some key", "property2": "another property" } 表B中的记录类似于: { "
A
和B
表A中的记录类似于:
{
"url":"some url",
"repeated_nested": [
{"key":"some key","property":"some property"}
]
}
{
"key":"some key",
"property2": "another property"
}
表B中的记录类似于:
{
"url":"some url",
"repeated_nested": [
{"key":"some key","property":"some property"}
]
}
{
"key":"some key",
"property2": "another property"
}
我希望找到一种方法将这些数据连接在一起,生成一行,如下所示:
{
"url":"some url",
"repeated_nested": [
{
"key":"some key",
"property":"some property",
"property2":"another property"
}
]
}
我尝试的第一个问题是:
SELECT
url, repeated_nested.key, repeated_nested.property, repeated_nested.property2
FROM A
AS lefttable
LEFT OUTER JOIN B
AS righttable
ON lefttable.key=righttable.key
这不起作用,因为BQ不能在重复的嵌套字段上联接。每行没有唯一的标识符。如果我要对重复嵌套的执行展平
,那么我不确定如何将原始行正确地放回一起
数据是这样的:url
将始终具有相同的重复\u嵌套的
字段。因此,我能够使用UDF进行变通,将重复的嵌套对象汇总到JSON字符串中,然后再次展开:
SELECT url, repeated_nested.key, repeated_nested.property, repeated_nested.property2
FROM
JS(
(
SELECT basetable.url as url, repeated_nested
FROM A as basetable
LEFT JOIN (
SELECT url, CONCAT("[", GROUP_CONCAT_UNQUOTED(repeated_nested_json, ","), "]") as repeated_nested
FROM
(
SELECT
url,
CONCAT(
'{"key": "', repeated_nested.key, '",',
' "property": "', repeated_nested.property, '",',
' "property2": "', mapping_table.property2, '"',
'}'
)
) as repeated_nested_json
FROM (
SELECT
url, repeated_nested.key, repeated_nested.property
FROM A
GROUP BY url, repeated_nested.key, repeated_nested.property
) as urltable
LEFT OUTER JOIN [SDF.alchemy_to_ric]
AS mapping_table
ON urltable.repeated_nested.key=mapping_table.key
)
GROUP BY url
) as companytable
ON basetable.url = urltable.url
),
// input columns:
url, repeated_nested_json,
// output schema:
"[{'name': 'url', 'type': 'string'},
{'name': 'repeated_nested_json', 'type': 'RECORD', 'mode':'REPEATED', 'fields':
[ { 'name': 'key', 'type':'string' },
{ 'name': 'property', 'type':'string' },
{ 'name': 'property2', 'type':'string' }]
}]",
// UDF:
"function(row, emit) {
parsed_repeated_nested = [];
try {
if ( row.repeated_nested_json != null ) {
parsed_repeated_nested = JSON.parse(row.repeated_nested_json);
}
} catch (ex) { }
emit({
url: row.url,
repeated_nested: parsed_repeated_nested
});
}"
)
此解决方案适用于小桌子。但是我正在处理的现实生活中的表比我上面的示例中有更多的列。当除了url
和repeated\u nested\u json
之外还有其他字段时,它们都必须通过UDF传递。当我使用50 gb左右的表时,一切都很好。但是当我将UDF和查询应用于500-1000GB的表时,我从BQ得到一个内部服务器错误
最后,我只需要GCS中所有新行分隔JSON格式的数据。作为最后的努力,我尝试将所有字段连接成一个JSON字符串(因此我只有一列),希望能够将其导出为CSV并获得所需的内容。但是,导出过程跳过了双引号,并在JSON字符串周围添加了双引号。根据作业()上的BQ文档,有一个属性configuration.query.tableDefinitions.(key.csvOptions.quote
,可以帮助我。但我不知道如何让它工作
有人对他们如何处理这种情况有什么建议吗?我从来没有这样做过,但你应该能够使用展平
,然后加入,然后使用嵌套
再次获取重复字段
文档声明BigQuery总是展平查询结果,但这似乎是错误的:如果设置了目标表,则可以选择不展平结果。然后,您应该能够将该表作为JSON导出到存储
另请参见如何使nest
正常工作。@AndrewBackes-本周我们推出了一些针对UDF内存相关问题的修复方案;这里和这里都有一些关于根本原因的细节
您查询的UDF版本现在适用于我;您是否可以验证?“BQ的内部服务器错误”-请出示工作证,以便团队能够investigate@FelipeHoffasharethis.com:quixotic-spot-526:bquijob\u 39502947\u 1535e1c5f59一个棘手的细节:没有干净的方法可以使用NEST
取回重复记录——您只能在叶字段上使用NEST
取回单个重复记录。为了解决这个问题,你可以考虑把记录记录到一个字符串中(如问题中提到的),使用<代码> Nest 将它恢复到一个重复的字段,然后使用UDF来打开记录。BTW,我们对SQL语言的改进很快就会使所有这些变得容易得多。跟随以获得通知。此外,NEST
必须与分组依据一起使用。在我的例子中,我还没有能够编造一个字段来使用上的groupby
。Jeremy-带有UDF方法的打包/解包json实际上是最接近工作解决方案的。然而,当我在500gb-1000gb的表中使用它时,BQ的响应是:“内部服务器错误”Andrew,那么url
呢?如果这不是每行唯一的,您可以(在展平
之前)使用row\u number()over()
创建一个唯一的列。