我已将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行数据。我想将其返回,以便将其加载到数据表中,用户可以对其进行排序并查看所有数据。我得到两个错误之一:
如果我按上述方式运行查询,我会得到:
如果我只是尝试选择它(SELECT * FROM tableId),我得到:
对于媒体下载,我尝试过指定alt:' media'在参数中,但我认为这不适用于Google Apps脚本(我无法在任何地方找到相关文档)。
我也试过循环查询,所以选择* limit 0,1000,然后选择* limit 1001,2000,等等。但是,融合表SQL似乎也不支持。
此时,我可能只是将CSV保留在我的驱动器中,即时解析它,但那是我的最后一招。任何建议将不胜感激!
答案 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 + "'";
我花了最后两天试图解决这个问题,所以我希望它可以帮助那些人!