Google bigquery &引用;我的别名;是内联表,因此不能位于外部联接的外部部分
我正在尝试运行类似以下内容的查询:Google bigquery &引用;我的别名;是内联表,因此不能位于外部联接的外部部分,google-bigquery,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是一个内联表,因此不能位于外部联接的外部部分。” 将联接从外部更改为内部时,它会工作(因此没有语法问题…) 有人能解释一下这个信息吗?我应该做些什么来避免它 谢谢TL
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是一个内联表,因此不能位于外部联接的外部部分。”
将联接从外部更改为内部时,它会工作(因此没有语法问题…)
有人能解释一下这个信息吗?我应该做些什么来避免它
谢谢TL;DR:在内部查询中使用
按每个人分组
内部查询
Select a, max(x) as b from Tbl1 group by a
不可平行准直。您可以并行计算部分结果,但为了知道a
的每个值的全局max(x)
,您只需要在一个位置运行该值。在外部查询中使用JOIN EACH
时,您指示查询引擎需要并行执行JOIN
。但是,您没有可并行化的源,因此查询失败
有两种方法可以解决这个问题:第一种是使用内部查询的显式并行版本——只需使用groupby
而不是groupby
。这可以并行执行,因为第一步是按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
。这可能会遇到大小限制,具体取决于表2的大小(因为要进行非每次连接,右侧的表必须是“小的”)
这无疑是次优的;您必须了解查询引擎如何工作,才能运行查询。也就是说,我们(bigquery和dremel团队)正在努力使查询“正常工作”,这样您就不必处理此类问题。我们在这方面取得了一些进展,在过去的几个月里已经消除了许多此类错误(例如,直到最近,内部连接也会失败),但我们还有一段路要走
谢谢你让我们注意到这一点。我已经提交了一个内部bug,以便我们能够在将来更好地工作