2016-04-17 15 views
4

這個S關於喬丹的回答這裏的後續問題:Weird error in BigQuery錯誤:TABLE_QUERY表達式無法查詢BigQuery表格

我使用查詢「Table_Query」中的參考表退出一段時間。現在,在Joradan最近指出的變化之後,我們的許多疑問都被打破了......我想問一下社區的建議,以尋找替代方案來解決我們正在做的事情。

我有包含事件的表(「MyTable_YYYYMMDD」)。我想查詢一段特定(或幾個)廣告系列的數據。該活動的時間段存儲在包含所有活動數據(ID,StartCampaignDate,EndCampaignDate)的表格中。爲了僅查詢相關表格,我們使用Table_Query(),並在TableQuery()中根據活動數據構建所有相關表格名稱的列表。 此查詢以多種形式以不同的參數運行多次。使用通配符功能(而不是查詢整個數據集)的原因是性能,執行成本和維護成本。因此,讓它查詢所有表並僅過濾結果不是一種選擇,因爲它會導致執行成本過高。

示例查詢將看起來像:

SELECT 
    * 
FROM 
    TABLE_QUERY([MyProject:MyDataSet] 'table_id IN 
    (SELECT CONCAT("MyTable_",STRING(Year*100+Month)) TBL_NAME 
    FROM DWH.Dim_Periods P 
    CROSS JOIN DWH.Campaigns AS LC 
    WHERE ID IN ("86254e5a-b856-3b5a-85e1-0f5ab3ff20d6") 
    AND DATE(P.Date) BETWEEN DATE(StartCampaignDate) AND DATE(EndCampaignDate))') 

現在這是打破...... 我的問題 - 的信息,它的表,你應該查詢存儲在參考表,你怎麼會只查詢當「TableQuery」不再被允許查詢參考表時,相關的表(分區)?

非常感謝

回答

2

的「簡單」的方法,我看到的是它拆分到兩個步驟
第1步 - 建立將被用於過濾的table_id的

SELECT GROUP_CONCAT_UNQUOTED(
        CONCAT('"',"MyTable_",STRING(Year*100+Month),'"') 
     ) TBL_NAME_LIST 
FROM DWH.Dim_Periods P 
CROSS JOIN DWH.Campaigns AS LC 
WHERE ID IN ("86254e5a-b856-3b5a-85e1-0f5ab3ff20d6") 
AND DATE(P.Date) BETWEEN DATE(StartCampaignDate) AND DATE(EndCampaignDate) 

注意的變化在查詢列表轉換結果可以列出您將在步驟2使用

第2步 - 最終的查詢

SELECT 
    * 
FROM 
    TABLE_QUERY([MyProject:MyDataSet], 
       'table_id IN (<paste list (TBL_NAME_LIST) built in first query>)') 

上述步驟,很容易在你可能使用
如果您的BigQuery的Web UI中使用的任何客戶端來實現 - 這讓你做一些額外的手動「動作」,你可能不會感到高興

我答案是顯而易見的,你很可能已經作爲一個選項,但想提

+0

謝謝,的確,我們已經考慮過這個解決方案。但是,我更喜歡避免多個步驟的查詢......我擔心隨着時間的推移,維護變得複雜,因爲邏輯分散在多個地方,並且在此過程中還有更多可能的失敗點。 –

+0

如果您正在尋找解決您所要求的解決方法 - 這是您擁有的解決方案,而且您不會得到我可以告訴您的一步解決方案。如果您試圖提出要求或要求Google小組 - 您最好使用https://code.google.com/p/google-bigquery/:o)所以我們不會浪費時間回答,即使我喜歡回答並沒有任何問題 - 這是更多的指向你正確的渠道 –

+0

Mikahil,我沒有讀取NN的評論作爲一個人試圖說明一個觀點。他只是指出你的解決方案是次優的,就我所知,他有一個有效的論點。解決方案的另一個問題是它也會影響查詢性能。希望還有另一種解決方法,或者最終由Google提供 – Zvi

0

這不是理想的解決方案。但它似乎在做這項工作。

在我以前的查詢中,我將ID列表作爲構建查詢的外部過程中的參數傳遞。我希望這個過程不知道查詢中實現的任何邏輯。

我們最終想出了這個解決方案:

傳遞ID的列表,而不是,我們通過一個包含每個ID相關的元數據的JSON。我們在Table_Query()函數中解析這個JSON。因此,我們不是查詢物理參考表,而是查詢某種「表變量」,我們已經放入JSON中。
下面是一個在演示此解決方案的公共數據集上運行的示例查詢。

SELECT 
    YEAR, 
    COUNT (*) CNT 
FROM 
    TABLE_QUERY([fh-bigquery:weather_gsod], 'table_id in 
(Select table_id 
From 
(Select table_id,concat(Right(table_id,4),"0101") as TBL_Date from [fh-bigquery:weather_gsod.__TABLES_SUMMARY__] 
where table_id Contains "gsod" 
)TBLs 
CROSS JOIN 
(select 
Regexp_Replace(Regexp_extract(SPLIT(DatesInput,"},{"),r"\"fromDate\":\"(\d\d\d\d-\d\d-\d\d)\""),"-","") as fromDate, 
Regexp_Replace(Regexp_extract(SPLIT(DatesInput,"},{"),r"\"toDate\":\"(\d\d\d\d-\d\d-\d\d)\""),"-","") as toDate, 
FROM 
(Select 
"[ 
     { 
     \"CycleID\":\"123456\", 
     \"fromDate\":\"1929-01-01\", 
     \"toDate\":\"1950-01-10\" 
     },{ 
     \"CycleID\":\"123456\", 
     \"fromDate\":\"1970-02-01\", 
     \"toDate\":\"2000-02-10\" 
     } 
    ]" 
    as DatesInput)) RefDates 
    WHERE TBLs.TBL_Date>=RefDates.fromDate 
    AND TBLs.TBL_Date<=RefDates.toDate 
)') 
GROUP BY 
    YEAR 
ORDER BY 
    YEAR 

該解決方案並不理想,因爲它需要外部進程來了解存儲在參考表中的數據。 理想情況下,BigQuery團隊將重新啓用此非常有用的功能。

相關問題