에 맞을 받고"응답이 너무 큰 오류"를 사용할 때 NTILE 기능으로 공개를 들어 데이터 집합에서 위키백과

StackOverflow https://stackoverflow.com//questions/22055788

  •  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.그것이 될 수 있는 에 맞 버그,하지만 몇 가지 이유로 이 값들을 통해 오는 문자열로 그렇지 않으면,이상한 일.

희망이 누군가가 도움이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top