2012-12-19 2 views
1

나는 다음과 같은 필드의 BigQuery의 테이블이에 대한 전체 데이터 세트에 대한 응답이 너무 큰 오류를 제공하지만 :BigQuery에 동등한 하위 쿼리

time,a,b,c,d 

time는 ISO8601 형식으로 만 공간을 가진 문자열을 a는이다 1에서 16000 사이의 정수이며 다른 열은 문자열입니다. 이 테이블에는 한 달 분량의 데이터가 포함되어 있으며 하루에 수백만 개의 레코드가 있습니다.

다음 쿼리는 "너무 큰 반응"실패 :

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day,b,c,d,count(a),count(distinct a, 1000000) 
from [myproject.mytable] 
group by day,b,c,d 
order by day,b,c,d asc 

그러나,이 쿼리가 작동 (데이터가 2012-01-01부터 시작)

select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, 
    b,c,d,count(a),count(distinct a) 
from [myproject.mytable] 
where UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) = UTC_USEC_TO_DAY(PARSE_UTC_USEC('2012-01-01 00:00:00')) 
group by day,b,c,d 
order by day,b,c,d asc 

이 수도 그것과 같다 this issue와 관련이 있습니다. 그러나 group by 절로 인해 최상위 쿼리는 두 번째 쿼리를 반복적으로 호출하는 것과 같습니다. 쿼리 플래너가이 문제를 처리 할 수 ​​있습니까?

편집 : 내가 생성 된 가짜 테스트 데이터를 사용하고

: 내 테스트 데이터를 명확하게합니다. 나는 원래 여러 필드를 사용하여 한 달 동안 시간별 요약을 얻으려고했다. (group by hour, 여기서 시간은 을 사용하여 쿼리의 select 부분에 정의 됨). 그게 실패했을 때 나는 매일 바꾸려고 노력했다. 그게 실패했을 때 저는 관련된 열을 줄였습니다. 그것도 count (distinct xxx, 1000000)을 사용할 때 실패했지만 하루의 가치가있을 때만 효과가있었습니다. (그것은 또한 내가 1000000 매개 변수를 제거하지만 는 하루 쿼리 작업을 수행 이후 쿼리 플래너는 내가 기대하는 것처럼 일을 분리하지 않는 것 같다 작동합니다.) 하나는 count (distinct) 검사

카디널리티있다 16,000이고 그룹 별 열은 카디널리티 2와 20을 가지며 총 1200 개의 예상 행을 나타냅니다. 열 값은 약 10 자 정도로 매우 짧습니다.

답변

1

얼마나 많은 결과를 기대합니까? 현재 허용되는 결과의 총 크기에는 약 64MB 제한이 있습니다. 결과적으로 수백만 행이 예상된다면 예상보다 큰 오류 일 수 있습니다.

결과 수가 너무 크지 않은 경우 크기 문제가 최종 응답이 아니라 내부 계산 일 수 있습니다. 특히 GROUP BY의 결과가 너무 많으면 쿼리에서 메모리가 부족할 수 있습니다. 한 가지 가능한 솔루션은 "GROUP BY"를 "GOUP EACH BY"로 변경하여 쿼리가 실행되는 방식을 변경하는 것입니다. 이것은 현재 실험 중이며 아직 문서화되지 않은 기능입니다. 당신의 쿼리

, 당신은에 의해 그룹의 선택에 이름 ​​필드를 참조하기 때문에, 당신이 할 필요가 있습니다 답변에 대한

select day, b,c,d,day,count(a),count(distinct a, 1000000) 
FROM (
    select UTC_USEC_TO_DAY(PARSE_UTC_USEC(time)) as day, b, c, d 
    from [myproject.mytable] 
) 
group EACH by day,b,c,d 
order by day,b,c,d asc 
+0

감사합니다; 내 데이터에 대한 자세한 내용을 올려 놓았습니다. (죄송합니다!) 필자는 최대 정확한 수를 뚜렷하게 올렸습니다. 'group by each '을 시도했지만 그룹화 컬럼 중 하나가'as'('select utc_usec_to_day (day)')에서 왔기 때문에'Error : Field day가 쿼리에 사용되었지만 찾을 수 있습니다. " – polm23

+0

문제는 기억력이 있습니다. count (distinct xxx, 1000000)를 사용하면 실행 엔진이 결과별로 각 그룹에 대해 최대 100000 개의 항목을 추적해야 함을 의미합니다. 따라서 예상 행 수가 1200 개라면 1을 저장할 수 있습니다.2 * 10^9 값은 계산 트리의 루트에 할당되어야합니다. –

+0

각 그룹이 어떻게 당신을 위해 일할 수 있다고 생각하는지 설명하기 위해 답을 업데이트했습니다. –