Google bigquery Google大查询中的分组问题

Google bigquery Google大查询中的分组问题,google-bigquery,Google Bigquery,我是谷歌大查询和堆栈溢出的新手,主要测试大查询处理精心编制和拙劣编制的查询的速度 我在MySQL上运行缓慢的繁琐查询方面遇到了困难。大查询按内容抱怨组。以下是开始查询: SELECT nonstops.term, nonstops.lincat, nonstops.id, MIN( (1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))* (1-((LEA

我是谷歌大查询和堆栈溢出的新手,主要测试大查询处理精心编制和拙劣编制的查询的速度

我在MySQL上运行缓慢的繁琐查询方面遇到了困难。大查询按内容抱怨组。以下是开始查询:

SELECT nonstops.term, nonstops.lincat, nonstops.id, 
MIN(
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(1-((LEAST(1,minusone.catimp / nonstops.catimp) + LEAST(1,minusone.catweb / nonstops.catweb))/2))*
(nonstops.catweb * nonstops.catweb * nonstops.catimp / nonstops.fnvweb / nonstops.fnvimp)
)
AS calc FROM nonstops INNER JOIN EACH minusone ON nonstops.lincat = minusone.lincat AND nonstops.term = minusone.term 
WHERE nonstops.lincat = 556 GROUP BY nonstops.term, nonstops.lincat
ORDER BY `calc`  DESC
请注意,由于两个表都很大,因此每个表都添加到内部联接中。我已经删除了数据集名称,以便于阅读

GROUP BY旨在返回联接为每个term/lincat对所做计算的最低值

我得到的错误是:

L1:62:GROUP BY列表中不存在表达式“phrases.nonstaps.id”

我不想在组中使用,但我添加了它,然后我得到:

GROUP BY列表中不存在表达式“calc”

这我也不想要!但如果我加上它,我会得到:

L7:1:无法按聚合进行分组


我查看了文档并寻找了答案,但没有运气。任何提示或链接将不胜感激

当您在BigQuery或任何SQL中按某个内容分组时,结果字段应该是按字段分组或聚合

否则,您应该获得nonstats.id的哪个值?可能有许多与一对nonstats.term、nonstats.lincat关联

您可以选择id字段的最大值、最小值等;按此字段分组,然后计算术语、lingcat和id的每个元组;或者,如果您不需要此字段,也可以删除它-如果您想要每个nonstats.term、nonstats.lincat对的“calc”表达式的结果


BigQuery抱怨'calc'的原因是不同的——当您使用遗留SQL方言时,BigQuery不会对引号使用backticks'。所以它认为它们是名称的一部分,它是一个与“calc”字段分开的新字段。只需删除它们或使用BigQuery的引号[and]-[calc]。或者切换到标准SQL方言。

谢谢Michael,倒勾确实是个问题。GROUP BY中缺少的id字段是一个很好的点,对于这个数据,它在MySQL中工作得很好,因为已知结果为每个分组生成相同的id,这有点冗余,但使用了id上的索引。我按照建议更改了它,它工作了。应该加上,性能方面,它花费了75秒2.5GB的数据。将查询拆分为一个连接,生成一组数据,然后运行GROUP BY需要20秒,然后是15秒。一个32 GB 2133Mhz RAM的Linux机箱,8 GB由MySQL使用一个相当慢的AMD A10处理器7850K,数据位于三星840 SSD上,完成完整查询或拆分它们大约需要2000秒。Performance-vise我认为在加入BigQuery之前进行过滤可能会使您受益,但BigQuery本身还不够聪明:选择。。。从选择。。从lincat=556的非停止内部连接每个选择。。从minusone,其中lincat=556在NONSTAPS.lincat=minusone.lincat和NONSTAPS.term=minusone.term组按NONSTAPS.term,NONSTAPS.lincat顺序按calc DESC再次感谢Michael,他应该已经清楚地表明,lincat=556已从这些统计数据的查询中删除,因此需要进行所有计算。您的建议是提高性能的一个非常方便的技巧,我开始看到BigQuery非常棒,但它有一些怪癖。很值得学习,如果善良的人花时间指出这些怪癖,那就更好了。