2017-05-04 6 views
0

66 MBのcsvファイルをFusion Tablesに読み込みました。それは約475k行の長さと12列の幅です。Google AppsスクリプトのFusion Tablesから大きなデータを照会

私はGoogle Apps Scriptを使用しており、その中のデータを照会しようとしています。

列の1つは、そのデータが所属する人物の名前です(Joeなど)。私は素敵なフォーマットで彼にそれを表示することができますので、外にジョーのすべてのデータをプルする場合

、私はこのクエリを使用しています:

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

問題は、ジョーが約52Kラインを持っているということですデータ。私はそれを返すので、それをデータテーブルにロードすることができ、ユーザーはそれをソートしてすべてのデータを見ることができます。

  • 応答コード:413メッセージ:応答が大きすぎると私が得る上記のように、私は、クエリを実行する場合

    :私は2つのエラーのいずれかを取得します。

私はちょうど(TABLEID SELECT * FROM)それをすべてを選択しようとすると、私が手:

  • 応答サイズは10メガバイトよりも大きくなっています。メディアのダウンロードを使用してください

メディアのダウンロードでは、パラメータにalt: 'media'を指定しようとしましたが、Google Appsスクリプト内で動作するとは思われません(ドキュメントはどこにも見つかりません)。

私もクエリをループしてみましたので、* limit 0,1000を選択してから* limit 1001,2000、ectを選択してください。しかし、融合表SQLはどちらもそれをサポートしていないようです。

この時点で、ドライブにCSVを残して、その場で解析することもできますが、それが私の最後の手段です。何かアドバイスをいただければ幸いです!

答えて

0

だから私はこれを理解したと思う。

Joeがいくつのレコードがあるかを確認し、必要に応じてループを実行するだけのクイッククエリを実行します。

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 
} 

注意する最後のものがある:合計行は、私が欲しいよりも大きい場合、私は、クエリを構築するためにOFFSETとLIMITパラメータを使用

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]; 

:私は40,000レコードを最大に設定しましたユーザ名は、インスタンス「ジョン・スミス」の二つの単語、であるならば、あなたはあなたのユーザ名を引用符で囲むに追加し、その代わりに

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

のために必要があるかもしれないことそれは次のようになります。

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

私はこのことを理解しようと最後の2日間を過ごすので、誰かを助けることを願っています!

関連する問題