Google bigquery 使用bigquery和单个分区查询,根据日期将表拆分为多个表

Google bigquery 使用bigquery和单个分区查询,根据日期将表拆分为多个表,google-bigquery,Google Bigquery,我想做的最初原因是: 恢复一个表,使其保持原来的分区,而不是全部进入今天的分区 我想我能做的就是把bq加载到一个临时表中。然后运行一个查询,按照bq分区所需的命名约定,即sharded_yyyyymmdd,每天将该表拆分为一个表。然后运行bq分区 本页提供了一些示例,但需要每天运行一个查询。可能有数百人: bq查询-使用旧的\u sql=false-允许\u大的\u结果-替换\ -NOPLANT_结果-目标_表'mydataset.temps$20160101'\ '从'bigquery pub

我想做的最初原因是:

恢复一个表,使其保持原来的分区,而不是全部进入今天的分区

我想我能做的就是把bq加载到一个临时表中。然后运行一个查询,按照bq分区所需的命名约定,即sharded_yyyyymmdd,每天将该表拆分为一个表。然后运行bq分区

本页提供了一些示例,但需要每天运行一个查询。可能有数百人:

bq查询-使用旧的\u sql=false-允许\u大的\u结果-替换\ -NOPLANT_结果-目标_表'mydataset.temps$20160101'\ '从'bigquery public data.noaa_gsod.gsod2016'中选择stn和temp,其中mo=01和da=01限制100'

那么,如何生成一个遍历所有日期并每天生成一个表的查询呢


我在这里发现了一个类似的问题,但是没有关于使用单个查询的答案。

这里的主要问题是每天都进行完整扫描。剩下的问题就不那么严重了,可以在任何情况下轻松地编写脚本

所以,下面是如何避免每天进行完整的表格扫描

请在下面一步一步地尝试查看方法 它足够通用,可以扩展/应用到您的真实案例中-同时,我在您的问题中使用了与您相同的示例,并且我将练习限制为仅10天

步骤1–创建透视表 在这一步中,我们a将每一行的内容压缩到记录/数组中,b将它们全部放入各自的“每日”列中

标准SQL 选择 数组_CONCAT_AGGCASE当d='day20160101'时,则r结束为day20160101, 数组_CONCAT_AGGCASE当d='day20160102'时,则r结束为day20160102, 数组_CONCAT_AGGCASE,当d='day20160103'时,r结束为day20160103, 数组_CONCAT_AGGCASE,当d='day20160104'时,则r结束为day20160104, 数组_CONCAT_AGGCASE当d='day20160105'时,r结束为day20160105, 数组_CONCAT_AGGCASE当d='day20160106'时,则r结束为day20160106, 数组_CONCAT_AGGCASE当d='day20160107'时,则r结束为day20160107, 数组_CONCAT_AGGCASE,当d='day20160108'时,r结束为day20160108, 数组_CONCAT_AGGCASE,当d='day20160109'时,r结束为day20160109, 数组_CONCAT_AGGCASE,当d='day20160110'时,r结束为day20160110 从…起 选择d、r、按d多分区的行数作为行 从…起 选择 stn,CONCAT'day',year,mo,da作为d,ARRAY_AGGt作为r 摘自“bigquery公共数据.noaa_gsod.gsod2016”作为t 按stn、d分组 分组 在带有pivot_表的Web UI中运行上述查询,您可以在此处选择任意名称作为目标

如您所见-这里我们将得到10列的表-一天一列,每列的模式是原始表模式的副本:

步骤2–逐个创建分片表,仅扫描相应列,不扫描完整表

标准SQL 选择r* 从pivot_表中,UNNESTday20160101作为r 使用名为mytable_20160101的目标表从Web UI运行上述查询

你可以在第二天跑步

标准SQL 选择r* 从pivot_表中,UNNESTday20160102作为r 现在应该有名为mytable_20160102的目标表,以此类推 您应该能够使用您选择的任何客户机自动化/编写此步骤的脚本 注意:这些最终的每日表将和原始表具有完全相同的模式

您可以使用上述方法,这取决于您的创造力


注意:BigQuery允许表中最多有10000列,所以一年中各天的365列在这里绝对不是问题:o

在这里回答我自己。我见过的另一种方法是编写一个脚本:

解析tablebackup.json文件,根据提供的参数输出tablebackuppartitionYYYYMMDD.json拆分的多个文件

创建一个批处理脚本,以便bq将所有文件加载到相应的表分区中


脚本需要逐行或块处理,才能处理大规模备份。这需要一些时间。使用这种方法的优点是,它将是通用的和可用的一个未经训练的BQ系统管理员。

@丹尼尔Balon -如果答案帮助你和你接受它-也请考虑表决它。投票选出有帮助的答案,即使它已经被接受或即将被接受。还有更多。。。当有人回答你的问题时,你可以检查一下该做什么。