BigQuery 中使用引用另一个表的 UDF 的相关子查询错误

Posted

技术标签:

【中文标题】BigQuery 中使用引用另一个表的 UDF 的相关子查询错误【英文标题】:Correlated subqueries error in BigQuery using UDF that references another table 【发布时间】:2020-06-03 23:44:42 【问题描述】:

自 2020 年 6 月 2 日起,BigQuery 支持在 UDF 中引用表和视图。但是,明显的用例(对我来说)恢复了一个错误,上面写着:“不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。”

我的查询是这样的:

SELECT airport, udf_dataset.getcity(airport) AS city
FROM my_table

UDF getcity 看起来像这样:

SELECT city_code FROM my_cities_table
WHERE airport_code = airport_input

my_cities_table 对每个机场的城市进行一对一的引用。

我的猜测是,执行 JOIN 可以有效地获取每个机场的城市值,而 UDF 会查询每个机场值,从而创建相关性。我的猜测对吗?如果是这样,那么在 UDF 中支持表引用就不太值得了。

【问题讨论】:

我刚刚尝试过,它对我来说非常适合临时和永久 UDF。可能在您的查询中的其他地方出现问题。提供更多详细信息,以便我们进一步帮助您 就这么直接,我不是在简化查询。 my_cities_table 有大约 10k 行,my_table 大约有 200 万行,也许它们的大小与它有关,特别是因为我尝试使用 UDF 引用具有 40 条记录的表并且它通过了。即使没有错误,您是否在那里看到相关查询? 您介意分享一些数据吗?所以我可以进一步调查。如果没有与您相同/相似的数据,我无法重现您的错误。 我确实找到了支持尺寸假设的其他东西。在我之前的评论中,我提到尝试使用引用具有 40 条记录的表的 UDF。该 UDF 过滤 WHERE 子句中的分区,将查找表缩小到 40 条记录。如果我删除分区过滤器并使用 LIMIT 1 语句,查找表的大小约为 35k,并且出现相关错误。在提交的示例中,my_table 有 40 多列,my_cities_table 有 10 列,但我只选择显示的字段,所以我认为这没有帮助。 我有另一个线索:谷歌的文档在限制部分说“每个查询的唯一 UDF 加上表引用的最大数量 - 1000。完全扩展后,每个 UDF 最多可以引用 1000 个组合的唯一表和UDF。”这可能是相关的,但不知道如何测试它。我如何知道我的查询有多少唯一的 UDF 加表引用?究竟什么是完整扩展? 【参考方案1】:

经过一些迭代,我得到了 Google 的答复,虽然它没有解决问题,但它确实阐明了发生了什么。

绝不应使用 UDF 代替 JOIN 操作,即使 UDF 包含在 JOIN 操作本身上。这会创建相关查询,并且直接 JOIN 更有效。我试图在一个经常使用的转换中做到这一点,所以这样代码可以更短。

关于完全扩展后每个查询最多 1000 个唯一 UDF 加上表引用,当 FROM 子句中涉及通配符时,它指的是结果表,但在我的初始示例中,计数很简单。

我希望这对像我一样尝试这样做的人有所帮助。

【讨论】:

以上是关于BigQuery 中使用引用另一个表的 UDF 的相关子查询错误的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery UDF 在另一个表中查找最大值

如何在 BigQuery SQL 中添加数组?

UDF's in redshift : 可以在另一个中引用一个 udf

描述如何在 SQL 中内联定义 Javascript UDF 函数的 BigQuery 文档在哪里(不是在 UDF 编辑器或单独的文件中)?

MySQL 用另一个表的值更新一个表 - 我可以在 bigquery 中使用它吗?

您能否创建一个 BigQuery UDF 来生成表列表,而不是对行进行操作?