2017-05-04 117 views
0

我已經將66 MB csv文件加載到Fusion Tables。它大約有475k排,12列寬。從Google Apps腳本的Fusion Tables中查詢大數據

我正在使用Google Apps腳本並嘗試查詢其中的數據。

其中一列是數據所屬人員的姓名,例如Joe。

如果我想要把所有喬的數據出來,所以我可以在一個不錯的形式顯示給他,我正在使用此查詢:

var tableId = my_table_id; 
var sql1 = "SELECT * FROM " + tableId + " WHERE 'User' = 'Joe'"; 
var result = FusionTables.Query.sql(sql1,{hdrs : false}); 

的問題是,喬有大約52K的線數據。我想返回它,以便我可以將它加載到數據集,用戶可以對它進行排序並查看所有數據。我得到兩個錯誤之一:

如果我運行查詢如上獲得:

  • 響應碼:413消息:響應太大。

如果我只是嘗試選擇它的所有(SELECT * FROM TABLEID),我得到:

  • 響應的大小大於10 MB。請使用媒體下載

對於媒體下載,我試過在參數中指定alt:'media',但我認爲這不適用於Google Apps腳本(我無法在任何地方找到文檔)。

我也曾嘗試通過查詢循環,所以選擇*極限0,1000,然後選擇*極限1001,2000,等。但是,融合表SQL似乎也不支持這一點。

此時,我可能會將CSV保留在我的驅動器中,並在飛行中對其進行解析,但這是我的最後手段。任何意見,將不勝感激!

回答

0

所以我想我明白了這一點。我敢肯定,這不是最完美的解決方案,但在這裏有雲:

我運行一個快速查詢以檢查計數()喬,看看有多少記錄有且僅當需要的運行循環。我最大設置到40000條記錄:

var total_rows_query = "SELECT COUNT() FROM " + tableId + " WHERE 'User' = " + username; 
    var total_rows = FusionTables.Query.sql(total_rows_query,{hdrs : false}).rows[0][0]; 

如果總行大於我想要的,我用的是offset和limit參數構造查詢:

max_rows = 40000; 
if(total_rows > max_rows){ 
var counter = 0; 
//adding in a zero to the ranges since the last query will be the offset of 0, meaning all of them 
var ranges = [0] 

while(counter + chunk_size < total_rows){ 
counter = counter + chunk_size; 
ranges.push(counter) 
} 
ranges.push(total_rows) 

//Now ranges is an array with zero at the beginning, and counting up by the chunk size I want, ending with the total_rows for the user as the last oen 

//This is the array that will be output after concating 
var output = [] 

//looping through the array, setting the offset to the first item, and the limit to the next item minus the first 
for(i=0;i<ranges.length-1;i++){ 
var offset = ranges[i] 
    var limit = ranges[i+1] - offset 

    var query = "SELECT * FROM " + tableId + " WHERE 'User' = '" + username + "' OFFSET " + offset + " LIMIT " + limit; 
output = output.concat(FusionTables.Query.sql(query,{hdrs : false}).rows) 
} 

}else{ 
//if the count is less or equal to the chunk size, just run the one query 
var query = "SELECT * FROM " + tableId + " WHERE 'User' = " + username; 
    var output = FusionTables.Query.sql(query,{hdrs : false}).rows 
} 

要注意的事情就是如果用戶名是兩個詞,例如「約翰·史密斯」,你可能需要在引號周圍添加您的用戶名,所以不是

var total_rows_query = "SELECT COUNT() FROM " + tableId + " WHERE 'User' = " + username; 

這將是:

var total_rows_query = "SELECT COUNT() FROM " + tableId + " WHERE 'User' = '" + username + "'"; 

我花的最後兩天試圖弄清楚這一點,所以我希望這有助於有人出來!