예제가 포함된 Hive 조인 및 하위 쿼리 튜토리얼
쿼리 결합
조인 쿼리는 Hive에 있는 두 테이블에 대해 수행할 수 있습니다. 이해를 위해 회원가입 Concepts 여기 분명히 우리는 여기에 두 개의 테이블을 만들고 있습니다.
- Sample_joins(고객 세부 정보와 관련됨)
- Sample_joins1(직원이 수행한 주문 세부 정보와 관련됨)
단계 1) 직원의 ID, 이름, 나이, 주소 및 급여 열 이름이 포함된 "sample_joins" 테이블 생성
단계 2) 데이터 로드 및 표시
위 스크린샷에서
- Customers.txt에서 Sample_joins로 데이터 로드
- Sample_joins 테이블 내용 표시
단계 3) Sample_joins1 테이블 생성 및 데이터 로딩, 표시
위의 스크린샷에서 우리는 다음을 관찰할 수 있습니다.
- Orderid, Date1, Id, Amount 열이 포함된 Sample_joins1 테이블 생성
- Orders.txt에서 Sample_joins1로 데이터 로드
- Sample_joins1에 있는 레코드 표시
앞으로 우리가 만든 테이블에서 수행할 수 있는 다양한 유형의 조인을 살펴보겠지만 그 전에 조인에 대한 다음 사항을 고려해야 합니다.
조인에서 관찰해야 할 몇 가지 사항은 다음과 같습니다.
- 조인에서는 동등 조인만 허용됩니다.
- 동일한 쿼리에서 두 개 이상의 테이블을 조인할 수 있습니다.
- 일치하지 않는 ON 절에 대한 더 많은 제어를 제공하기 위해 LEFT, RIGHT, FULL OUTER 조인이 존재합니다.
- 조인은 교환 가능하지 않습니다.
- 조인은 LEFT 조인인지 RIGHT 조인인지에 관계없이 왼쪽 결합입니다.
다양한 유형의 조인
조인에는 4가지 유형이 있습니다.
- 내부 조인
- 왼쪽 외부 조인
- 오른쪽 외부 결합
- 전체 외부 결합
내부 조인 :
두 테이블에 공통된 레코드는 이 내부 조인에 의해 검색됩니다.
위의 스크린샷에서 우리는 다음을 관찰할 수 있습니다.
- 여기서는 (c.Id= o.Id)와 같은 조건이 일치하는 Sample_joins 테이블과 Sample_joins1 테이블 사이에 JOIN 키워드를 사용하여 조인 쿼리를 수행합니다.
- 쿼리에 언급된 조건을 확인하여 두 테이블에 모두 존재하는 공통 레코드를 표시하는 출력
검색어 :
SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);
왼쪽 외부 조인:
- Hive 쿼리 언어 LEFT OUTER JOIN은 오른쪽 테이블에 일치하는 항목이 없더라도 왼쪽 테이블의 모든 행을 반환합니다.
- ON 절이 오른쪽 테이블의 XNUMX개 레코드와 일치하는 경우 조인은 여전히 오른쪽 테이블의 각 열에 NULL이 있는 결과 레코드를 반환합니다.
위의 스크린샷에서 우리는 다음을 관찰할 수 있습니다.
- 여기서는 (c.Id= o.Id)와 같은 조건이 일치하는 Sample_joins 테이블과 Sample_joins1 테이블 사이에 "LEFT OUTER JOIN" 키워드를 사용하여 조인 쿼리를 수행합니다.예를 들어 여기서는 직원 ID를 참조로 사용하고 있으며, ID가 테이블의 오른쪽과 왼쪽에서 공통인지 여부를 확인합니다. 일치하는 조건으로 작용합니다.
- 쿼리에 언급된 조건을 확인하여 두 테이블 모두에 존재하는 공통 레코드를 표시하는 출력입니다. 위 출력의 NULL 값은 Right 테이블인 Sample_joins1에 값이 없는 열입니다.
검색어 :
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
오른쪽 외부 조인:
- Hive 쿼리 언어 RIGHT OUTER JOIN은 왼쪽 테이블에 일치하는 항목이 없더라도 오른쪽 테이블의 모든 행을 반환합니다.
- ON 절이 왼쪽 테이블의 XNUMX개 레코드와 일치하는 경우 조인은 여전히 왼쪽 테이블의 각 열에 NULL이 있는 결과 레코드를 반환합니다.
- RIGHT 조인은 항상 오른쪽 테이블의 레코드와 왼쪽 테이블의 일치하는 레코드를 반환합니다. 왼쪽 테이블에 해당 열에 해당하는 값이 없으면 해당 위치에 NULL 값이 반환됩니다.
위의 스크린샷에서 우리는 다음을 관찰할 수 있습니다.
- 여기서는 (c.Id= o.Id)와 같은 조건이 일치하는 Sample_joins 테이블과 Sample_joins1 테이블 사이에 "RIGHT OUTER JOIN" 키워드를 사용하여 조인 쿼리를 수행합니다.
- 쿼리에 언급된 조건을 확인하여 두 테이블에 모두 존재하는 공통 레코드를 표시하는 출력
질문:
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
완전 외부 조인:
쿼리에 제공된 JOIN 조건을 기반으로 Sample_joins 및 Sample_joins1 테이블의 레코드를 결합합니다.
두 테이블의 모든 레코드를 반환하고 양쪽에서 일치하는 값이 누락된 열에 대해 NULL 값을 채웁니다.
위의 화면 샷에서 다음 사항을 확인할 수 있습니다.
- 여기서는 (c.Id= o.Id)와 같은 조건이 일치하는 Sample_joins 테이블과 Sample_joins1 테이블 사이에 "FULL OUTER JOIN" 키워드를 사용하여 조인 쿼리를 수행하고 있습니다.
- 쿼리에 언급된 조건을 확인하여 두 테이블에 있는 모든 레코드를 표시하는 출력입니다. 여기서 출력되는 Null 값은 두 테이블의 열에서 누락된 값을 나타냅니다.
질문
SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)
하위 쿼리
쿼리 내에 존재하는 쿼리를 하위 쿼리라고 합니다. 기본 쿼리는 하위 쿼리에서 반환된 값에 따라 달라집니다.
하위 쿼리는 두 가지 유형으로 분류될 수 있습니다.
- FROM 절의 하위 쿼리
- WHERE 절의 하위 쿼리
사용시기 :
- 서로 다른 테이블의 두 열 값에서 결합된 특정 값을 얻으려면
- 다른 테이블에 대한 한 테이블 값의 종속성
- 다른 테이블의 한 열 값 비교 확인
구문 :
Subquery in FROM clause SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main > Subquery in WHERE clause SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);
예:
SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2
여기서 t1과 t2는 테이블 이름입니다. 색칠된 부분은 테이블 t1에서 수행된 하위 쿼리입니다. 여기서 a와 b는 하위 쿼리에 추가되어 col1에 할당된 열입니다. Col1은 Main 테이블에 있는 열 값입니다. 하위 쿼리에 있는 이 "col1" 열은 col1 열의 기본 테이블 쿼리와 동일합니다.
사용자 정의 스크립트 포함
하이브 클라이언트 요구 사항에 맞게 사용자별 스크립트를 작성할 수 있는 가능성을 제공합니다. 사용자는 요구 사항에 맞게 자신만의 맵과 축소 스크립트를 작성할 수 있습니다. 이를 임베디드 사용자 정의 스크립트라고 합니다. 코딩 논리는 사용자 정의 스크립트에 정의되어 있으며 ETL 시간에 해당 스크립트를 사용할 수 있습니다.
임베디드 스크립트를 선택해야 하는 경우:
- 클라이언트별 요구 사항에 따라 개발자는 Hive에서 스크립트를 작성하고 배포해야 합니다.
- Hive 내장 기능이 특정 도메인 요구 사항에 대해 작동하지 않는 경우
이를 위해 Hive에서는 TRANSFORM 절을 사용하여 맵 및 감속기 스크립트를 모두 포함합니다.
이 내장된 사용자 정의 스크립트에서 우리는 다음 사항을 준수해야 합니다.
- 열은 문자열로 변환되고 사용자 스크립트에 제공되기 전에 TAB으로 구분됩니다.
- 사용자 스크립트의 표준 출력은 TAB으로 구분된 문자열 열로 처리됩니다.
샘플 임베디드 스크립트,
FROM ( FROM pv_users MAP pv_users.userid, pv_users.date USING 'map_script' AS dt, uid CLUSTER BY dt) map_output INSERT OVERWRITE TABLE pv_users_reduced REDUCE map_output.dt, map_output.uid USING 'reduce_script' AS date, count;
위 스크립트에서 다음을 관찰할 수 있습니다.
이것은 이해를 위한 샘플 스크립트일 뿐입니다.
- pv_users는 map_script에 언급된 사용자 ID 및 날짜와 같은 필드가 있는 사용자 테이블입니다.
- pv_users 테이블의 날짜 및 개수에 정의된 감속기 스크립트