Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 使用第一个或最后一个分区表会返回不一致的值_Google Bigquery - Fatal编程技术网

Google bigquery 使用第一个或最后一个分区表会返回不一致的值

Google bigquery 使用第一个或最后一个分区表会返回不一致的值,google-bigquery,Google Bigquery,在运行多个表的查询中使用LAST或FIRST时,返回的结果不一致。再次执行同一查询将每次返回不同的结果 返回的值与查询中某个表的正确最后和第一个值匹配。然而,在每种情况下使用的表格似乎是随机选择的 例如,下面的查询: SELECT FIRST(timestamp) as first_ts, FROM TABLE_DATE_RANGE([some_table]_, timestamp('2016-07-21'), timestamp('2016-07-22')) 将返回: first_t

在运行多个表的查询中使用LAST或FIRST时,返回的结果不一致。再次执行同一查询将每次返回不同的结果

返回的值与查询中某个表的正确最后和第一个值匹配。然而,在每种情况下使用的表格似乎是随机选择的

例如,下面的查询:

SELECT 
  FIRST(timestamp) as first_ts, 
FROM TABLE_DATE_RANGE([some_table]_, timestamp('2016-07-21'), timestamp('2016-07-22'))
将返回:

first_ts
2016-07-22 07:35:30 UTC
第一次运行,并且:

first_ts
2016-07-21 23:16:26 UTC
下一次运行。等等

预期结果是
2016-07-21 23:16:26
。但是,值
2016-07-22 07:35:30 UTC
是表
[some_table]\u 20160722
的第一个时间戳,因此我认为它发生的是BigQuery不允许您在跨表查询时对表进行排序。结果,第一个和最后一个变得不可靠,因为表的顺序未知。请注意,“最大”和“最小”在各个表中都能很好地工作

这不仅在使用传统SQL时是正确的,而且在使用新SQL和函数FIRST_VALUE和LAST_VALUE时也是正确的(因为不再支持FIRST和LAST。可能相关?),请参见下面使用新SQL的示例

SELECT
  FIRST_VALUE(timestamp) OVER (ORDER BY event_sequence ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_ts,
FROM `some_table_*` 
WHERE _TABLE_SUFFIX BETWEEN '20160721' AND '20160722'
此外(这可以被视为一个单独的问题),在查询一个表时,如果数据被多次附加到该表,则会观察到类似的行为。第一次和最后一次的结果变得不一致。加载的每个数据子集都作为一个分区

在我看来,这就像一只虫子,除非有人知道怎么做。谷歌Bigquery团队,我们爱你的产品。但是你能帮我修一下吗?我们不能以可靠的方式使用第一个和最后一个聚合,这对我们来说是一件大事。谢谢

我们不能以可靠的方式使用第一个和最后一个聚合,这是错误的 对我们来说是一件大事

我认为这里没有虫子

从文件:

第一(expr)
返回函数作用域中的第一个连续值

表本身不被视为有序的序列。BigQuery不保证输出行的顺序,除非您提供一些提示,例如ORDERBY

因此,在您的示例中,您应该使用下面的。这将为您提供可靠的预期结果

SELECT 
  FIRST(timestamp) AS first_ts
FROM (
  SELECT *
  FROM TABLE_DATE_RANGE([some_table]_, TIMESTAMP('2016-07-21'), TIMESTAMP('2016-07-22'))
  ORDER BY timestamp
)

注意:最大值和最小值当然起作用,因为它们不关心顺序

对,这是有意义的。谢谢很高兴知道,
表本身不被视为有序序列
。这就是我们目前正在使用的解决方案,但是对于我们必须查询的数据量,我们得到了一个
资源超出的
解决方案!提供更多的细节,我们可能会提供帮助:o)我建议你为这篇文章发布新的问题。行。谢谢重要信息:因此,您可以使用投票下方张贴答案左侧的勾号标记接受答案。看看为什么它很重要。还有更多。。。当有人回答你的问题时,你可以检查一下该做什么。