[SQL] 어떻게 BigQuery에서 피벗을 확장 할 수?
SQL어떻게 BigQuery에서 피벗을 확장 할 수?
하자 말, 나는 뮤직 비디오 플레이 통계 주어진 일에 대한 테이블 mydataset.stats (3B 행, 100 만 사용자, 6K 작가)가 있습니다. 단순화 된 스키마는 다음과 같습니다 UserGUID 문자열, ArtistGUID 문자열
스키마가 될 것입니다, 그래서 나는 열에 행에서 피벗 / 트랜스 아티스트가 필요합니다 : UserGUID 문자열, Artist1 INT, Artist2 INT, ... Artist8000 지능 아티스트와 함께 각각의 사용자 수를 재생
BigQuery에 / SQL에서 데이터 다량의 열과 행을 바꾸어하는 방법에 제안 접근이 있었다? 그리고 어떻게 Google BigQuery에서 범주의 수천 더미 변수 열을 만드는 방법? 하지만 같은 외모는 내 예제에서이 번호를 확장하지 않습니다
내 예를 들어이 방법을 확장 할 수 있습니까?
해결법
-
==============================
1.나는 최대 6000 개 기능에 대한 접근 방식 아래 시도하고 예상대로 일했다. 나는 열 수에 대한 하드 제한은 테이블에있는이 10K 기능까지 작동합니다 생각
나는 최대 6000 개 기능에 대한 접근 방식 아래 시도하고 예상대로 일했다. 나는 열 수에 대한 하드 제한은 테이블에있는이 10K 기능까지 작동합니다 생각
STEP 1 - 집계 사용자 / 작가 재생
SELECT userGUID as uid, artistGUID as aid, COUNT(1) as plays FROM [mydataset.stats] GROUP BY 1, 2
2 단계 - 표준화가 UID와 지원 - 그들은 연속적인 숫자 1, 2, 3 그래서 .... 우리는 적어도 두 가지 이유로이 필요합니다 : A)는 나중에 동적으로 더 유용해야 할) 수와 b 등의 소형으로 SQL을 생성 만든다 / 친화적 인 열 이름을
첫 번째 단계와 결합 -이 될 것입니다 :
SELECT u.uid AS uid, a.aid AS aid, plays FROM ( SELECT userGUID, artistGUID, COUNT(1) AS plays FROM [mydataset.stats] GROUP BY 1, 2 ) AS s JOIN ( SELECT userGUID, ROW_NUMBER() OVER() AS uid FROM [mydataset.stats] GROUP BY 1 ) AS u ON u. userGUID = s.userGUID JOIN ( SELECT artistGUID, ROW_NUMBER() OVER() AS aid FROM [mydataset.stats] GROUP BY 1 ) AS a ON a.artistGUID = s.artistGUID
테이블에하자 쓰기 출력 - mydataset.aggs
3 단계 - 이미 한 번에 N 기능 (예술가)에 대한 접근 방식 (언급 한 질문에 위의) 제안 사용. 내 특정 예에서, 실험에 의해, 그 기본적인 접근 방식은 2000과 3000 사이의 기능의 번호를 잘 작동 발견했다. 안전을 위해 나는 한 번에 2000 기능을 사용하기로 결정
스크립트는 동적으로 다음 분할 된 테이블을 만들 실행하는 것이 쿼리를 생성하기 위해 사용되는 아래의
SELECT 'SELECT uid,' + GROUP_CONCAT_UNQUOTED( 'SUM(IF(aid=' + STRING(aid) + ',plays,NULL)) as a' + STRING(aid) ) + ' FROM [mydataset.aggs] GROUP EACH BY uid' FROM (SELECT aid FROM [mydataset.aggs] GROUP BY aid HAVING aid > 0 and aid < 2001)
위 쿼리는 다른 쿼리 아래와 같이 아직 생산 :
SELECT uid,SUM(IF(aid=1,plays,NULL)) a1,SUM(IF(aid=3,plays,NULL)) a3, SUM(IF(aid=2,plays,NULL)) a2,SUM(IF(aid=4,plays,NULL)) a4 . . . FROM [mydataset.aggs] GROUP EACH BY uid
이것은 실행하고 mydataset.pivot_1_2000에 기록되어야한다
3 단계를 실행 두 번 더 우리가 세 가지 이상의 테이블 mydataset.pivot_2001_4000를 얻을 수 (조정 원조> NNNN 원조
4 단계 - 모든 기능 최종 선회 테이블의 모든 파티션 피봇 테이블을 병합 한 테이블의 열로 표시
위의 단계에서와 동일합니다. 처음에 우리는 쿼리를 생성하고 실행 필요 그래서 처음에 우리는 mydataset.pivot_1_2000 및 mydataset.pivot_2001_4000을 "스티치"합니다. 그런 다음 mydataset.pivot_4001_6000과 결과
SELECT 'SELECT x.uid uid,' + GROUP_CONCAT_UNQUOTED( 'a' + STRING(aid) ) + ' FROM [mydataset.pivot_1_2000] AS x JOIN EACH [mydataset.pivot_2001_4000] AS y ON y.uid = x.uid ' FROM (SELECT aid FROM [mydataset.aggs] GROUP BY aid HAVING aid < 4001 ORDER BY aid)
위의 출력 문자열을 실행해야하고 mydataset.pivot_1_4000에 기록 및 결과
그런 다음 우리는 다음과 같은 4 단계를 반복
SELECT 'SELECT x.uid uid,' + GROUP_CONCAT_UNQUOTED( 'a' + STRING(aid) ) + ' FROM [mydataset.pivot_1_4000] AS x JOIN EACH [mydataset.pivot_4001_6000] AS y ON y.uid = x.uid ' FROM (SELECT aid FROM [mydataset.aggs] GROUP BY aid HAVING aid < 6001 ORDER BY aid)
mydataset.pivot_1_6000에 기록하기 결과
생성 된 테이블 스키마 다음이 있습니다 :
uid int, a1 int, a2 int, a3 int, . . . , a5999 int, a6000 int
노트: ㅏ. 난 단지 최대 6000 개 기능에이 방법을 시도하고는 예상대로 일했다 비. 60 분 20 내지 변화 단계 3 및 4 초 / 메인 쿼리에 대한 런타임 씨. 중요 : (90) 좋은 뉴스 1까지 변화 3 단계와 4 단계에서 청구 계층은 각각의 테이블의 크기 (30-40메가바이트) 그래서 상대적으로 작은 바이트를 청구 않는다는 것입니다. 프로젝트의 모든 2016 년 10 월 티어 1로하지만, 이후에 청구됩니다 "2016 년이되기 전에"에 대한이 문제가 될 수 있습니다. 자세한 내용은 고-계산 쿼리에서 타이밍 참조 디. BigQuery를 가진 대규모 데이터의 변환 상기 실시 예 쇼 파워! 아직 내가 저장이 기능 매트릭스가 가장 생각이 아니다 구체화하는 것이 (하지만 내가 잘못 될 수 있습니다) 생각
from https://stackoverflow.com/questions/34845697/how-to-scale-pivoting-in-bigquery by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 데이터없이 MySQL을 수출 스키마 (0) | 2020.04.22 |
---|---|
[SQL] 하나 개의 셀에 여러 값의 SQL 쿼리 (0) | 2020.04.22 |
[SQL] 어떻게 가입하여 다른 테이블에서 존재하지 않는 데이터를 찾는 방법은? (0) | 2020.04.22 |
[SQL] 어떻게 MS Access 쿼리에서 직접 시스템 사용자 이름을 사용 하는가? (0) | 2020.04.22 |
[SQL] 결과를 사용할 수까지 여러 건의 SELECT를 시도하는 방법? (0) | 2020.04.22 |