【发布时间】:2014-05-24 00:19:55
【问题描述】:
我们有一个每周备份流程,将我们的生产 Google Appengine Datastore 导出到 Google Cloud Storage,然后到 Google BigQuery。每周,我们都会创建一个名为 YYYY_MM_DD 的新数据集,其中包含当天生产表的副本。随着时间的推移,我们收集了许多数据集,例如2014_05_10、2014_05_17 等。我想创建一个数据集Latest_Production_Data,其中包含最新YYYY_MM_DD 数据集中每个表的视图。这将使下游报告更容易编写一次查询并始终检索最新数据。
为此,我的代码从 BigQuery API 获取最新数据集和数据集包含的所有表的名称。然后,对于这些表中的每一个,我都会调用 tables.insert 来创建一个视图,该视图是我要创建引用的表中的 SELECT *。
对于包含 RECORD 字段的表,这将失败,这看起来是一个非常良性的列命名规则。
例如,我有这张桌子:
为此我发出此 API 调用:
{
'tableReference': {
'projectId': 'redacted',
'tableId': u'AccountDeletionRequest',
'datasetId': 'Latest_Production_Data'
}
'view': {
'query': u'SELECT * FROM [2014_05_17.AccountDeletionRequest]'
},
}
这会导致以下错误:
HttpError: https://www.googleapis.com/bigquery/v2/projects//datasets/Latest_Production_Data/tables?alt=json 返回“无效的字段名称”__key__.namespace。字段只能包含字母、数字、和下划线,以字母或下划线开头,长度最多为 128 个字符。">
当我在 BigQuery 网络控制台中执行此查询时,列被重命名以将 . 转换为 _。当我发出创建视图 API 调用时,我有点预料到会发生同样的事情。
是否有一种简单的方法可以以编程方式为我的数据集中的每个表创建一个视图,而不管它们的底层架构如何?我现在遇到的问题是记录列,但我预计的另一个问题是具有重复字段的表。 SELECT * 是否有一些神奇的替代方案可以为我处理所有这些错综复杂的问题?
我的另一个想法是做一个table copy,但如果可以避免的话,我宁愿不复制数据。
【问题讨论】:
-
我记得 BQ 开发人员说过一些关于视图的一些错误,
SELECT *。你可以尝试一下SELECT语句中明确提到所有字段名称吗? -
我想这会起作用,但它需要读取每个表的模式来生成定义每个视图的 SQL。相反,我可能会退回到表格复制方法。
标签: google-bigquery