에 맞을 받고"응답이 너무 큰 오류"를 사용할 때 NTILE 기능으로 공개를 들어 데이터 집합에서 위키백과
-
21-12-2019 - |
문제
기본적으로 나 테스트 NTILE 기능을 나눈 총 단어수 위키백과 테이블로 100 버킷 등이 있습니다.나는 받고"응답이 너무 큰 오류"사용합니다.그래서 나 bq CLI 도구 모두--destination_table 및--allow_large_results 없는 옵션이 행운입니다.
쿼리는 다음과 같습니다:
SELECT id, num_characters, NTILE(100) OVER (ORDER BY num_characters) percentile
FROM [publicdata:samples.wikipedia]
어떻게 검색할 수 있는 결과를 바르게 되어있습니까?
해결책
BigQuery의 놀라운 성능을위한 비밀 : 작업 부하를 배포합니다. 쿼리를 발행 할 때마다 많은 수의 컴퓨터가 병렬로 모든 데이터를 읽고, 처리하고 체인의 다른 컴퓨터로 전달합니다.
그러나 평행화하기가 매우 어려운 작업 - 일반적으로 다른 모든 일이 끝난 후 실행되는 기능이 있습니다. 이러한 작업은 배포되지 않지만 하나의 컴퓨터에 맞는 모든 데이터에 제한됩니다. 순서 및 Over ()는 다음 중 일부입니다. 결국 단일 컴퓨터가 전체 결과를 정렬해야합니다.
좋은 소식은 우리에게는 대안이 있습니다. 퀀텀은 모든 데이터를 통과하면서 대략적인 결과를 계산할 수 있습니다.
SELECT QUANTILES(num_characters, 100)
FROM [publicdata:samples.wikipedia]
Query complete (1.7s elapsed, 2.34 GB processed)
.
또는 원래 질문보다 똑같은 (주문=)을 실행하지만 데이터 샘플을 통해 :
SELECT id, num_characters, NTILE(100) OVER (ORDER BY num_characters) percentile
FROM [publicdata:samples.wikipedia]
WHERE id % 10 = 0;
Query complete (258.7s elapsed, 4.68 GB processed)
.
둘 다 비슷한 결과를 낳습니다 (샘플링에 의해 다른 하나는 다른 하나는 하나씩)이지만 하나는 훨씬 빠릅니다.
다른 팁
당신이 사용할 수 있는 UDF 를 얻을 수있는 기능을 nTiles 의없이 모든 데이터는 메모리 포화도 할 필요없이,샘플이 비록 그것이 작을 수 있습 확대됨.
내가 채택한 이 방법을 계산하는 백분위 값에서 떨어졌다,그냥 다음과 같 내장 NTILE
기능입니다.내장 기능을 실행하는 것의 중 메모리 ORDER BY
작업에 적용될 경우 대규모 수의 행이 있습니다.
사용자 정의 기능을 걸립 변위치 배열 (이 경우에 사용하여 생성 APPROX_QUANTILES
고) 값 고 반환하는 ntile 값입니다.
-- Define UDF
CREATE TEMPORARY FUNCTION getNTile(quantiles ARRAY<INT64>, val INT64)
RETURNS INT64
LANGUAGE js AS """
var ntile = 0;
while(parseInt(val, 10) > parseInt(quantiles[ntile], 10) && ntile < quantiles.length) {
ntile+=1;
}
return ntile;
""";
-- Calculate an array of approximate quantiles, in this case percentiles
WITH master AS (
SELECT
id,
num_characters
FROM
`publicdata.samples.wikipedia`
),
quantiles AS (
SELECT
APPROX_QUANTILES(num_characters, 99) AS approx
FROM
master
)
-- Use UDF with approx quantile array to find nTile
SELECT
id,
num_characters,
getNTile(quantiles.approx, num_characters) AS percentile
FROM
master,
quantiles
JS 코드에서는 UDF 이 강제로 값을 정수진 parseInt
.그것이 될 수 있는 에 맞 버그,하지만 몇 가지 이유로 이 값들을 통해 오는 문자열로 그렇지 않으면,이상한 일.
희망이 누군가가 도움이 됩니다.