“我的别名”是一个内联表,因此不能位于外连接的外部

时间:2014-01-19 12:27:00

标签: google-bigquery

我正在尝试运行类似于以下的查询:

Select Table1.a,Table1.b,Table2.c
From 
(Select a, max(x) as b
from Tbl1 
group by a
) as Table1
LEFT JOIN EACH Table2
ON 
Join Condition

我得到“Table1是一个内联表,所以不能在外连接的外部。”

当将Join从外部更改为Inner时,它可以工作(因此没有语法问题......)。

有人可以解释一下这个消息,我该怎么做才能避免它?

由于

1 个答案:

答案 0 :(得分:5)

TL; DR:在内部查询中使用GROUP EACH BY

内部查询

Select a, max(x) as b from Tbl1  group by a 

不是平行的。您可以并行计算部分结果,但为了了解max(x)'的每个值的全局a,您只需要在一个地方运行。在外部查询中使用JOIN EACH时,您将指示您需要并行执行JOIN执行的查询引擎。但是,您没有可兼容的源,因此查询失败。

有两种方法可以解决此问题:第一种方法是使用内部查询的显式并行版本 - 只需使用GROUP EACH BY而不是GROUP BY。这可以并行执行,因为第一步是按a字段对基础表进行排序,以便您可以计算并行工作程序中每个a字段的全局最大值。如果内部查询是可并行化的,那么外部查询也可以并行执行。这看起来像是:

Select Table1.a,Table1.b,Table2.c
From 
(Select a, max(x) as b
from Tbl1 
group EACH by a -- note the EACH keyword here
) as Table1
LEFT JOIN EACH Table2
ON 
Join Condition

第二个选项是在外部查询上使用JOIN而不是JOIN EACH。这可能会遇到大小限制,具体取决于Table2的大小(因为要进行非连接,右侧的表需要为'小'。)。

这无疑是次优的;您必须了解查询引擎的工作方式才能使查询运行。也就是说,我们(在bigquery和dremel团队中)正在努力使查询“正常工作”,这样您就不必处理这类问题。我们在这方面取得了一些进展,在过去几个月中已经删除了许多这类错误(例如,内部联接直到最近才会失败),但我们还有很长的路要走。

感谢您引起我们的注意。我已经提交了一个内部错误,以便我们将来能够更好地完成这项工作。