2017-05-04 1 views
0

66MB의 csv 파일을 Fusion Tables에로드했습니다. 길이는 약 475k이고 폭은 12입니다.Google Apps Script의 Fusion Tables에서 큰 데이터 쿼리

Google Apps Script를 사용하고 거기에있는 데이터를 쿼리하려고합니다.

열 중 하나는 데이터가 속한 사람의 이름입니다 (예 : Joe). 내가 멋진 형식으로 그에게 표시 할 수 있도록 밖으로 조의 모든 데이터를 가져하려면

, 나는이 쿼리를 사용하고 있습니다 :

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

문제는 조 약 52K 라인을 가지고 있다는 것입니다 데이터. 나는 그것을 반환 할 수 있도록 데이터베이스에로드 할 수 있고 사용자는이를 통해 정렬하고 모든 데이터를 볼 수 있습니다.

  • 응답 코드 : 내가 얻을 위와 같이 내가 쿼리를 실행하면

    : 나는 두 가지 오류 중 하나를 얻을 (413) 메시지 : 응답이 너무 큽니다.

난 그냥 모두 선택하려고하면 (TABLEID SELECT * FROM는) 내가 얻을 :

  • 응답 크기 10 MB보다 더 크다. 미디어 다운로드를 사용하십시오

미디어 다운로드의 경우 매개 변수에 alt : '미디어'를 지정하려고 시도했지만 Google Apps 스크립트에서 작동하지 않는다고 생각합니다. (어디에서나 설명서를 찾을 수 없습니다.).

또한 쿼리를 반복하므로 * 제한 0,1000을 선택하고 * 제한 1001,2000 개를 선택하십시오. 그러나 융합 테이블 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 일을 보낸다. 그래서 나는 그것이 누군가를 돕기를 바란다!

관련 문제