Google bigquery BQ:不支持引用其他表的相关子查询-其中数组_AGG不实用
我们在BQ中大量使用了Google bigquery BQ:不支持引用其他表的相关子查询-其中数组_AGG不实用,google-bigquery,Google Bigquery,我们在BQ中大量使用了ARRAY和STRUCT,由于主题中的错误,我们无法更改数组的内容。 下面是一个使用公共数据的简单示例。假设内部联接无法工作,因为图像丢失、故意丢失或出错 现在,我知道通常您可以将左连接从数组重新定义移动到from子句,并使用array\u AGG,但这并不总是可能的 在我们的例子中,要更新的数组之外的“其他字段”是其他数组或结构,比如github嵌套的表 由于您无法在STRUCT或ARRAY字段上执行SELECT DISTINCT,因此最终需要取消对所有内容的测试,并从头
ARRAY
和STRUCT
,由于主题中的错误,我们无法更改数组的内容。
下面是一个使用公共数据的简单示例。假设内部联接
无法工作,因为图像丢失、故意丢失或出错
现在,我知道通常您可以将左连接
从数组重新定义移动到from
子句,并使用array\u AGG
,但这并不总是可能的
在我们的例子中,要更新的数组之外的“其他字段”是其他数组或结构,比如github嵌套的表
由于您无法在STRUCT
或ARRAY
字段上执行SELECT DISTINCT
,因此最终需要取消对所有内容的测试,并从头开始重新创建具有许多数组聚集、大量资源消耗和OOM风险的表。这对于具有大量嵌套字段的表是不可能的
SELECT
* EXCEPT(webDetection),
STRUCT(
webDetection.partialMatchingImages,
webDetection.pagesWithMatchingImages,
webDetection.fullMatchingImages,
ARRAY(
SELECT AS STRUCT
fmi.score,
fmi.url,
i.object_id
FROM
data.webDetection.fullMatchingImages fmi
LEFT JOIN
`bigquery-public-data.the_met.images` i
ON
fmi.url = i.original_image_url
) AS fullMatchingImages_from_met,
webDetection.webEntities
) AS webDetection
FROM
`bigquery-public-data.the_met.vision_api_data` data
知道如何避免重新聚合吗?假设您的查询在概念上是正确的,唯一的问题是错误引用其他表的相关子查询不受支持
-尝试替换下面的片段
FROM
data.webDetection.fullMatchingImages fmi
LEFT JOIN
`bigquery-public-data.the_met.images` i
ON
fmi.url = i.original_image_url
与
FROM
data.webDetection.fullMatchingImages fmi
CROSS JOIN
`bigquery-public-data.the_met.images` i
WHERE
fmi.url = i.original_image_url
更新,以添加不匹配的URL
假设您的查询在概念上是正确的,唯一的问题是错误引用其他表的相关子查询不受支持
——请尝试替换下面的片段
FROM
data.webDetection.fullMatchingImages fmi
LEFT JOIN
`bigquery-public-data.the_met.images` i
ON
fmi.url = i.original_image_url
与
FROM
data.webDetection.fullMatchingImages fmi
CROSS JOIN
`bigquery-public-data.the_met.images` i
WHERE
fmi.url = i.original_image_url
更新,以添加不匹配的URL
要扩展上面的答案,可能是一个查询——我的另一个查询——失败了,因为优化器仍然认为子查询太复杂
在这种情况下,请尝试避免使用UNION ALL
并使用ARRAY\u CONCAT()
:
BQ接受了这一点,有趣的是,它比UNION ALL更快!几乎与数组相同的运行时(…内部联接…
另一方面,即使使用那些冗长的解决方法(可能不会持续下去),BigQuery
优化器也需要进一步优化。参考原始错误消息引用其他表的相关子查询不受支持,除非它们可以被取消相关,例如通过将它们转换为有效联接
,简单的左联接
对我来说非常有效
@读者们,供你们参考,这方面存在漏洞。一定要“星”它的优先级 扩展上面的答案,可能是因为优化器仍然认为子查询太复杂,所以一个查询(对我来说是另一个)失败了
在这种情况下,请尝试避免使用UNION ALL
并使用ARRAY\u CONCAT()
:
BQ接受了这一点,有趣的是,它比UNION ALL更快!几乎与数组相同的运行时(…内部联接…
另一方面,即使使用那些冗长的解决方法(可能不会持续下去),BigQuery
优化器也需要进一步优化。参考原始错误消息引用其他表的相关子查询不受支持,除非它们可以被取消相关,例如通过将它们转换为有效联接
,简单的左联接
对我来说非常有效
@读者们,供你们参考,这方面存在漏洞。一定要“星”它的优先级 这不会导致与内部联接相同的结果吗?我会错过没有匹配图像的左侧url
s。为了举例说明,假设我在结果中选择了一个合并(I.original\u image\u url,“No image”)
,您有两个重复记录webDetection.fullMatchingImages
和webDetection.fullMatchingImages\u from\u met
。第一个具有所有初始值,第二个具有匹配对象的值。你真的需要第二个的多余的东西吗?但是是的-你是对的-在我最初的回答中,我把重点放在了你得到的错误上:o)见答案中的更新-我认为这就是你想要的(至少从结果来看)谢谢米哈伊尔!我喜欢在FROM
子句中将左连接拆分为匹配,然后在数组中使用NOT in
引用该连接。在我的例子中,在
中变成了而不是STRUCT(),因为使用了复合键,但这很有效!一个警告(见其他答案),但会接受;o) 这不会导致与内部联接相同的结果吗?我会错过没有匹配图像的左侧url
s。为了举例说明,假设我在结果中选择了一个合并(I.original\u image\u url,“No image”)
,您有两个重复记录webDetection.fullMatchingImages
和webDetection.fullMatchingImages\u from\u met
。第一个具有所有初始值,第二个具有匹配对象的值。你真的需要第二个的多余的东西吗?但是是的-你是对的-在我最初的回答中,我把重点放在了你得到的错误上:o)见答案中的更新-我认为这就是你想要的(至少从结果来看)谢谢米哈伊尔!我喜欢在FROM
子句中将左连接拆分为匹配,然后在数组中使用NOT in
引用该连接。在我的例子中,在
中变成了而不是STRUCT(),因为使用了复合键,但这很有效!一个警告(见其他答案),但会接受;o) 完整免责声明和信用:我从这篇文章中得到了丰富、筛选行和列现有数组的提示:完整免责声明和信用:我从这篇文章中得到了丰富、筛选行和列现有数组的提示: