Hive Note 7 - Sampling
Hive에서는 데이터 샘플링(SAMPLING) 기능을 제공하여 Hive 테이블에서 일정한 규칙에 따라 데이터 샘플링을 할 수 있으며, Hive의 데이터 샘플링은 배럴 테이블 샘플링과 데이터 블록 샘플링을 지원한다.
블록 샘플링(block Sampling)
입력한 inputSize에 따라 샘플링 n%입니다.
예를 들어 1G 크기로 입력하면 TABLESAMPLE(50 PERCENT)에서 512M의 데이터를 샘플링할 수 있다.
CREATE TABLE lxw1234 AS
SELECT * FROM lxw1 TABLESAMPLE (50 PERCENT);
이렇게 하면 샘플링 데이터의 크기를 M 단위로 지정합니다.
예를 들어, 다음 문구:
CREATE TABLE lxw1234_2 AS
SELECT * FROM lxw1 TABLESAMPLE (30M);
표 lxw1에서 30M의 데이터를 샘플링할 것입니다.
이런 방식은 줄 수에 따라 샘플을 추출할 수 있지만 특히 주의해야 한다. 여기에 지정한 줄 수는 인풋스플릿마다 샘플을 추출한 줄 수이다. 즉, 매프마다 샘플을 추출하는 n ROWS이다.
다음 문구:
SELECT COUNT(1) FROM (SELECT * FROM lxw1 TABLESAMPLE (200 ROWS)) x;
5개의 Map Task(Input Split)가 샘플링 200줄씩 총 1천 줄로 구성됩니다.
배럴 테이블 샘플링(Sampling Bucketized Table)
Hive의 배럴 테이블(Bucket Table)은 사실 특정한 필드에 따라 Hash를 추출하여 지정한 데이터를 넣는 통에 넣는다. 예를 들어 표 lxw1234를 ID에 따라 100개의 통으로 나누면 그 알고리즘은hash(id)% 100이다. 그러면hash(id)% 100=0의 데이터는 첫 번째 통에 넣고hash(id)% 100=1의 기록은 두 번째 통에 넣는다.배럴 테이블은 생성할 때 CLUSTER BY 문을 사용하여 생성됩니다.
Hive의 배럴 테이블 샘플링 구문은 다음과 같습니다.
table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
그 중에서 x는 표본을 추출할 통의 번호이고 통의 번호는 1부터이며,colname는 표본을 추출할 열을 나타내고 y는 통의 수량을 나타낸다.
SELECT COUNT(1)
FROM lxw1 TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
이 문장은 표 lxw1을 무작위로 10개의 통으로 나누어 첫 번째 통의 데이터를 추출하는 것을 나타낸다.
앞에서 설명한 바와 같이 표 lxw1의 총 크기는 약 64816816이고 총 기록수는 2750714이다
주의: 이 결과는 매번 운행할 때마다 다르다. 왜냐하면 무작위 수에 따라 배럴을 나누어 표본을 추출했기 때문이다.
만약 이미 분통표를 바탕으로 표본을 추출한다면 더욱 효율적일 것이다.
다음 문을 실행하여 배럴 테이블을 만들고 데이터를 삽입합니다.
CREATE TABLE lxw1_bucketed (pcid STRING)
CLUSTERED BY(pcid) INTO 10 BUCKETS;
INSERT overwrite TABLE lxw1_bucketed
SELECT pcid FROM lxw1;
표 lxw1bucketed는 pcid 필드에 따라 10개의 통으로 나뉘는데 다음 문장은 10개의 통에서 첫 번째 통을 추출한 데이터를 나타낸다.
SELECT COUNT(1) FROM lxw1_bucketed TABLESAMPLE(BUCKET 1 OUT OF 10 ON pcid);
SELECT COUNT(1) FROM lxw1_bucketed TABLESAMPLE(BUCKET 1 OUT OF 20 ON pcid)
시계는 10개의 통만 있고 20을 지정하면 결과를 볼 때 원본 시계가 기록한 1/20의 차이가 많지 않다. 하이브는 실행할 때 첫 번째 통에서 절반의 데이터를 추출한다.원본표에서 직접 통에 나누어 표본을 추출하면 같은 효과를 얻을 수 있다. 예를 들어 다음과 같다.
SELECT COUNT(1) FROM lxw1 TABLESAMPLE(BUCKET 1 OUT OF 20 ON pcid);
차이점은 이미 배럴이 나뉘어진 표본 추출을 바탕으로 조회는 해당 배럴의 데이터만 스캔하고 배럴이 나뉘지 않은 표본 추출을 바탕으로 조회할 때 전체 표본 데이터를 스캔하고 먼저 배럴을 나눈 다음에 표본을 추출해야 한다는 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.