如何在 Bigquery 查询中使表可选

Posted

技术标签:

【中文标题】如何在 Bigquery 查询中使表可选【英文标题】:How to make tables optional in a Bigquery Query 【发布时间】:2013-08-27 21:03:09 【问题描述】:

我有一组类似于“Partitioning by date?”的分片数据,但有些日子没有数据,因此没有日子。一个理想的解决方案是让所有表格(日期)都是可选的。这可能吗?

详细说明:如果您执行 select from 后跟序列 [main.2013-08-01], [main.2013-08-02], ... 每个表都必须存在。如果这些表中的任何一个不存在,bigquery 在尝试执行查询时会返回 500 错误。通过使用术语“可选”,我希望有一种语法允许任何特定的表不存在,但查询仍然对其他表执行总和。我希望的一个例子:也许查询说 SELECT * from ?[main.2013-08-01], ?[main.2013-08-02], ... 但是 [main.2013-08-02 ] 不存在。但是,因为它有“?”表之前的指示符被认为是可选的,查询仍然成功执行,并且我得到了结果,尽管仅来自 [main.2013-08-01] 和任何其他实际存在的表。

我目前正在解决这个问题,首先对数据集的表列表进行请求,然后与我实际想要查询的分片进行比较并合并表(例如,我想要八月的所有日子,bigquery 告诉我7/27 不存在,所以我的 FROM 块将包含所有数据分片的列表(除了 7/27),但是这种方法很复杂,并且涉及两次 bigquery 往返,所以看起来并不理想。

【问题讨论】:

我不确定我是否理解您所说的将表格设为可选的意思。 我用更多的细节编辑了这个问题,希望能把它弄清楚! 【参考方案1】:

作为一种解决方法,您是否尝试过使用空表?

假设 main.2013-08-01 存在,而 main.2013-08-02 不存在。你可以:

SELECT * FROM [main.2013-08-01] WHERE any_column = 'non existing value'

该查询将返回 0 个结果,您可以选择 main.2013-08-02 作为目标表。这将创建一个空表,其列与 main.2013-08-01 相同。那你就可以不顾空虚地加入了!

【讨论】:

谢谢 Fh,我怀疑这可以作为一种解决方法,但前提是我事先知道哪些表丢失了。为了找到丢失的表,我必须对所有可能的月份执行类似我现有的数据集表列表查询的操作,然后在此之上添加一个额外的步骤来执行您建议的查询,然后执行我的最终查询我实际上用来处理数据的。所以在这种特殊情况下,这种方法实际上比我目前使用的解决方法要慢。

以上是关于如何在 Bigquery 查询中使表可选的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC 中使文本框可选

从 Python 更新 BigQuery 表属性会使表消失

如何在控制器方法中使 JWT 令牌授权可选

布局:如何在垂直布局中使一个小部件成为其余小部件的 3 倍

在 netlify cms 和 gatsby js 中使图像可选

如何在 laravel 查询生成器中使隐藏属性可见?