2017-02-03 97 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系統管理員。