Google bigquery BQ:不支持引用其他表的相关子查询-其中数组_AGG不实用

Google bigquery BQ:不支持引用其他表的相关子查询-其中数组_AGG不实用,google-bigquery,Google Bigquery,我们在BQ中大量使用了ARRAY和STRUCT,由于主题中的错误,我们无法更改数组的内容。 下面是一个使用公共数据的简单示例。假设内部联接无法工作,因为图像丢失、故意丢失或出错 现在,我知道通常您可以将左连接从数组重新定义移动到from子句,并使用array\u AGG,但这并不总是可能的 在我们的例子中,要更新的数组之外的“其他字段”是其他数组或结构,比如github嵌套的表 由于您无法在STRUCT或ARRAY字段上执行SELECT DISTINCT,因此最终需要取消对所有内容的测试,并从头

我们在BQ中大量使用了
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) 完整免责声明和信用:我从这篇文章中得到了丰富、筛选行和列现有数组的提示:完整免责声明和信用:我从这篇文章中得到了丰富、筛选行和列现有数组的提示: