从Google Apps脚本查询Fusion Tables中的大数据

时间:2017-05-04 12:49:41

标签: google-apps-script google-fusion-tables

我已将66 MB的csv文件加载到Fusion Tables。它长约475k行,宽12列。

我正在使用Google Apps脚本并尝试查询其中的数据。

其中一列是该数据所属人员的姓名,例如Joe。

如果我想将所有Joe的数据都删除,以便我能以一种不错的格式显示给他,我会使用此查询:

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

问题在于Joe拥有大约52,000行数据。我想将其返回,以便将其加载到数据表中,用户可以对其进行排序并查看所有数据。我得到两个错误之一:

如果我按上述方式运行查询,我会得到:

  • 响应代码:413。消息:响应太大。

如果我只是尝试选择它(SELECT * FROM tableId),我得到:

  • 响应大小大于10 MB。请使用媒体下载

对于媒体下载,我尝试过指定alt:' media'在参数中,但我认为这不适用于Google Apps脚本(我无法在任何地方找到相关文档)。

我也试过循环查询,所以选择* limit 0,1000,然后选择* limit 1001,2000,等等。但是,融合表SQL似乎也不支持。

此时,我可能只是将CSV保留在我的驱动器中,即时解析它,但那是我的最后一招。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

所以我想我想出来了。我相信这不是最优雅的解决方案,但是这里有:

我运行一个快速查询来检查Joe的count()以查看有多少记录,并且只在需要时运行循环。我将最大值设置为40,000条记录:

  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
}

最后要注意的是,如果用户名是两个单词,例如'John Smith',您可能需要在用户名周围添加引号,而不是

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

这将是:

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

我花了最后两天试图解决这个问题,所以我希望它可以帮助那些人!