BigQuery:TABLE_QUERY,但表之间的列不同

Posted

技术标签:

【中文标题】BigQuery:TABLE_QUERY,但表之间的列不同【英文标题】:BigQuery: TABLE_QUERY but columns differ between tables 【发布时间】:2015-08-11 14:59:07 【问题描述】:

我们正在将 csv 文件加载到 BigQuery 中。每个文件都会创建一个单独的表。

当我们从这些表中进行选择时,我们主要使用表查询来执行此操作,因此:

SELECT foo, bar
FROM TABLE_QUERY(name_stub,'table_id CONTAINS "_something" and msec_to_timestamp(creation_time) > date_add(current_timestamp(), -90, "day")'));

现在我们为新文件添加了新字段。因此,我们现在除了拥有“foo”和“bar”字段之外,还拥有“baz”。

当我运行以下查询时,我收到错误,即字段“baz”不存在于旧表之一上。

SELECT foo, bar, baz
FROM TABLE_QUERY(name_stub,'table_id CONTAINS "_something" and msec_to_timestamp(creation_time) > date_add(current_timestamp(), -90, "day")'));

有没有办法选择“baz”并为没有该列的表设置一个默认值?

【问题讨论】:

【参考方案1】:

向表中添加新列是可能的(所有历史数据将自动具有 NULL),但您每天都在创建新表 - 而 TABLE_QUERY 只是 UNION 的一种快捷语法。 我唯一的想法是创建一个视图,将列“baz”添加到旧表中。然后您应该能够在此类视图和较新的表中使用 TABLE_QUERY。

【讨论】:

很好,我想最简洁的方法是创建视图,谢谢【参考方案2】:

更新:此问题已得到解决。

BigQuery 现在支持在表的子集具有更广泛架构的表上使用 TABLE_DATE_RANGE。缺少的列应在缺少列的表中显示为 NULL。

https://code.google.com/p/google-bigquery/issues/detail?id=439

【讨论】:

好消息!上面链接中的示例非常简化 - 这是否涵盖记录、重复等?【参考方案3】:

this question 的答案中说明了解决此问题的解决方案。

在我的情况下应该是:

SELECT foo, bar, coalesce(baz,0)
FROM TABLE_DATE_RANGE(mydataset.le_table,<beginning of time>,<day before column add>),
     TABLE_DATE_RANGE(mydataset.le_table,<day of column add>,<today>)

【讨论】:

以上是关于BigQuery:TABLE_QUERY,但表之间的列不同的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?

Google BigQuery:TABLE_QUERY 和 TABLE_DATE_RANGE

BigQuery 中的表函数和 FLATTEN

BigQuery 中的奇怪错误

如何搜索两个日期之间的记录。但表日期格式是 varchar

Django - 当用户提交表单时,会创建表,但表之间的连接不是