2017-02-03 98 views
1

原来的“为什么”什么,我想要做的是基于日期多个表:拆分表到使用的BigQuery与单个查询分区

还原表保持其原有的分区,而不是这一切会成为今天的划分。

什么,我想我可以做的是bq load到一个临时表。然后运行一个查询,将该表分成每天YYYYMMDD中的一个表,该命名约定是bq partition所需的命名约定,即sharded_YYYYMMDD。然后运行bq partition

此页https://cloud.google.com/bigquery/docs/creating-partitioned-tables给出的例子,但它需要每天运行查询。这可能是百位:

bq query --use_legacy_sql=false --allow_large_results --replace \ --noflatten_results --destination_table 'mydataset.temps$20160101' \ 'SELECT stn,temp from `bigquery-public-data.noaa_gsod.gsod2016` WHERE mo="01" AND da="01" limit 100'

那么,如何使一个单一的查询,将遍历所有的天,每天进行一个表?

我在这里发现了一个类似的问题Split a table into multiple tables in BigQuery SQL,但是对于使用单个查询来做这件事没有答案。

回答

3

这里的主要问题是具有每一天全扫描。剩下的问题就更少了,并且可以很容易地被编写出来。client of your choice

所以,下面是 - 如何避免每一天的全表扫描?

尝试下面的步骤一步看方法
它是通用的,足以扩展/应用到你的实际情况 - 同时我使用同样的例子,你在你的问题,我限制的运动,只是10天

1步 - 创建透视表
在这一步中,我们一)压缩每一行的内容到记录/阵列和b)把他们全部纳入各自的“日报”列

#standardSQL 
SELECT 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160101' THEN r END) AS day20160101, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160102' THEN r END) AS day20160102, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160103' THEN r END) AS day20160103, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160104' THEN r END) AS day20160104, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160105' THEN r END) AS day20160105, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160106' THEN r END) AS day20160106, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160107' THEN r END) AS day20160107, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160108' THEN r END) AS day20160108, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160109' THEN r END) AS day20160109, 
    ARRAY_CONCAT_AGG(CASE WHEN d = 'day20160110' THEN r END) AS day20160110 
FROM (
    SELECT d, r, ROW_NUMBER() OVER(PARTITION BY d) AS line 
    FROM (
    SELECT 
     stn, CONCAT('day', year, mo, da) AS d, ARRAY_AGG(t) AS r 
    FROM `bigquery-public-data.noaa_gsod.gsod2016` AS t 
    GROUP BY stn, d 
) 
) 
GROUP BY line 

在web用户界面中使用pivot_table运行以上查询(您可以选择任意名称)作为目标

正如您所看到的 - 在此处我们将获得包含10列的表 - 每列一列,每个模式列是原始表中的模式的副本:

enter image description here

步骤2 - 创建分片表一个接一个ONLY扫描各自的列(没有全表扫描)上述曲

#standardSQL 
SELECT r.* 
FROM pivot_table, UNNEST(day20160101) AS r 

润从目标表中的Web UI红霉素命名mytable_20160101

您可以第二天运行相同

#standardSQL 
SELECT r.* 
FROM pivot_table, UNNEST(day20160102) AS r 

现在你应该有目的地表命名mytable_20160102等
你应该能够自动/脚本这一步与您选择的任何客户端 注意:那些最终的日常表格将与原始表格具有完全相同的架构!

有如何,您可以使用上面的方法很多变化 - 它是由你的创造力

注:的BigQuery允许多达10000列在表中,因此365列了一年的各天绝对不是问题在这里:o)

+0

@ daniel-barron - 如果答案帮助了你,你接受了它 - 请考虑投票。 '。投票答案即使已被接受或将被接受也是有帮助的。还有更多......当某人回答你的问题时,你可以查看该怎么做 - http://stackoverflow.com/help/someone-answers。 –

0

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

  1. 解析tablebackup.json文件,输出许多文件上所提供参数tablebackuppartitionYYYYMMDD.json分裂。

  2. 创建一个批处理脚本到bq load所有的文件到合适的表分区。

该脚本将需要逐行或块处理才能处理大量备份。而且需要一些时间。使用这种方法的优势在于它是通用的,可用于未经训练的BQ系统管理员。