2015-01-02 1 views
1

저는 사용자 활동을 날짜별로 분석하려고합니다. 첫 번째 단계는 교차 가입과 where 절을 사용하여 사용자 계정을 만든 이후 매일 매일의 테이블을 만드는 것입니다. 내 첫 번째 시도였다이 :각 BigQuery가 훨씬 더 빠르게 교차합니다.

SELECT 
    u.user_id as user_id, 
    date(u.created) as signup_date, 
    cal.date as date, 

from rsdw.user u 
    cross join (select date(dt) as date from [rsdw.calendar] where date(dt) < CURRENT_DATE()) cal 
where 
    date(u.created) <= cal.date 

이 쿼리는 영원히 소요 (달력 테이블 2006 (3288 행 이후의 모든 날짜의 단지리스트) 사용자 테이블 ~ 100 만 행이 있습니다..). .. 너무 오랫동안 나는 그것을 1000 초 정도에 버렸다. 쿼리를 약간 조정 해 보았습니다. 내가 십자가에 "각"를 추가하면 가입 : 나는 "는 각각"하지만 테이블을 교환, 그냥 90 년대 완료 유지하는 경우, 마지막으로

Error: Cannot CROSS JOIN two tables with EACH qualifiers. 

:

SELECT 
    u.user_id as user_id, 
    date(u.created) as signup_date, 
    cal.date as date, 

from rsdw.user u 
    cross join each (select date(dt) as date from [rsdw.calendar] where date(dt) < CURRENT_DATE()) cal 
where 
    date(u.created) <= cal.date 

은 내가 errror를 얻을 수 !

SELECT 
    u.user_id as user_id, 
    date(u.created) as signup_date, 
    cal.date as date, 

from (select date(dt) as date from [rsdw.calendar] where date(dt) < CURRENT_DATE()) cal 
    cross join each rsdw.user u 
where 
    date(u.created) <= cal.date 

왜 세 번째 반복이 더 빨리 발생하고 두 번째 결과가 오류가 발생하는 이유를 설명 할 수 있습니까?

답변

4

조인이 sub-select 절과 상호 작용하는 방식으로 일부 대소 문자 구별을 시도하고 있습니다. 명명 된 테이블에 대한 조인은 테이블 크기를 기반으로하는 최적화를 통해 이익을 얻을 수 있지만 하위 선택은 예측할 수 없으므로 성능이 저하 될 수 있습니다. 이 사건을 개선하기 위해 내부 버그를 제기했습니다.

첫 번째로 느린 경우, 작은 하위 날짜 선택이 복사되어 다수의 사용자를 처리하는 소수의 컴퓨터로 브로드 캐스팅됩니다. 거의 병렬 처리가 없으므로 영원히 필요합니다.

두 번째 사례는 내부적 인 이유로 쿼리 구문 분석 오류입니다. 기본적으로 컴퓨터는 작은 범위의 날짜와 작은 범위의 사용자를 모두 처리하기 때문에 크로스 조인을 완료하지 않습니다.

세 번째로 빠른 경우, 작은 하위 날짜 선택이 복사되어 여러 컴퓨터로 전송되며 각 컴퓨터는 소규모 사용자를 처리합니다. 큰 병렬 처리로 인해 매우 빠르게 완료됩니다.

내가 제출 한 버그를 완료하면 세 번째 사례의 동작이 자동으로 발생합니다.

0

https://cloud.google.com/bigquery/query-reference을 기반으로하여 교차 조인은 "each"절을 지원하지 않기 때문에 세 번째 쿼리가 실행되는 것에 다소 놀랐습니다.

교차 결합은 카디 전 곱을 형성합니다 (왼쪽 테이블의 각 레코드는 올바른 쿼리의 각 레코드와 결합됩니다). 이는 매우 비효율적 인 방식으로 데이터를 결합합니다 (피할 수없는 경우도 있지만 귀하의 데이터 세트를 만들려고합니다). 사용자 테이블에 몇 개의 레코드가 있습니까? EACH 절은 왼쪽 테이블이 더 작은 테이블 (압축 된 8MB 미만) 일 때만 작동해야합니다. 귀하의 캘린더 테이블에는 3650 개의 레코드가 있으므로, 그 이상의 사용자가 있다면 세 번째 쿼리에서와 마찬가지로 왼쪽에 있어야합니다.

+1

필자는 테이블이 8MB보다 크거나 작지 않은 경우를 위해 각각의 것을 이해합니다. 이 문서의 https://cloud.google.com/bigquery/query-reference의 'EACH 수정 자'섹션을 참조하십시오. – alan

관련 문제