전체 글 1383

Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인)

Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인) · Version : Hive Hive에서 Left Semi Join (왼쪽 세미 조인)은 오른쪽 테이블에서 ON 조건을 만족하는 레코드를 찾을 경우 왼쪽 테이블의 레코드를 반환한다. 일반적인 RDBMS의 SQL은 조건을 만족하기 위해 IN 또는 EXISTS 구문을 지원하지만, 하이브에서는 동작하지 않는다. 하이브는 기본적으로 Right Semi Join (오른쪽 세미 조인) 을 지원하지 않으며 SELECT 와 WHERE절에서 오른쪽 테이블의 컬럼을 참조 할 수 없음에 주의해야 한다. 아래 스크립트는 하이브에서 사용할 수 있는 Left Semi Join의 예시이다. select a.c..

Hive JOIN 및 조인 최적화

Hive JOIN 및 조인 최적화 · Version : Hive Hive는 RDBMS와 같은 JOIN(조인) 구문을 제공하며 기능도 거의 유사하지만 동등조인(EQUI-JOIN)만 제공한다. 내부조인(INNER JOIN)의 경우 조인하는 모든 테이블에서 일치하는 레코드만 반환한다. ON 절은 두 테이블에서 조인할 레코드의 조건을명시한다. select a.col_1, b.col_2 from tbl_a inner join tbl_b on a.col_1 = b.col_1 RDBMS의 표준 SQL의 경우 조인 키에 대해서 비동등 조인(NON-EQUI-JOIN)을 허용하지만 하이브에서는 제공하지 않는다. 또한 하이브에서는 ON절에서 OR 조건의 사용을 허용하지 않는다. 만약 ON 절에 OR를 사용하려고 한다면 아래..

Hive LIKE 와 RLIKE

Hive LIKE 와 RLIKE · Version : Hive Hive에서 LIKE 구문은 RDBMS의 LIKE 구문과 동일한 동작으로, 어떤 서브 문자열(substring)이 문자열의 시작이나 끝, 혹은 문자열 내에서 일치하는지 확인할 수 있다. 아래 스크립트는 LIKE 구문으로 검색한 것이며, OR 절을 사용하여 여러개의 LIKE 구문을 사용하였다. DROP TABLE IF EXISTS TBL_A; CREATE TABLE TBL_A( COL_1 STRING ); INSERT INTO TBL_A(COL_1) VALUES ('CHICAGO'), ('NEWYORK'); SELECT * FROM TBL_A WHERE COL_1 LIKE '%CA%' OR COL_1 LIKE '%YO%'; 하이브는 LIKE 절..

HDFS fsimage와 에디트 로그

HDFS fsimage와 에디트 로그 · Version : HDFS HDFS 에서 클라이언트가 파일을 생성하거나 이동할때 에디트 로그에 먼저 기록한다. 네임노드는 파일시스템 메타데이터를 메모리로 로드하여 인-메모리 자료구조로 관리하며 에디트 로그가 수정된 후 업데이트를 진행한다. 인-메모리 메타데이터는 읽기 요청을 수행하는데 사용되며 각 디렉터리에 쓰기 동작이 끝나고 나서 성공했다는 결과가 클라이언트로 반환 되기전에 에디트 로그를 플러시하여 동기화한다. 이렇게 함으로서 장애가 발생해도 데이터 유실을 방지할 수 있다. fsimage는 파일시스템 데이터의 영속적인 체크포인트 파일이다. 하지만 개별 쓰기 동작 때마다 갱신되지는 않는다. fsimage는 파일 시스템에서 존재하는 모든 디렉터리와 파일 아이노드(i..

Hive는 무조건 MapReduce를 사용할까?

Hive는 무조건 MapReduce를 사용할까 · Version : Hive Hive에서 쿼리를 실행할때, 무조건 맵리듀스(MapReduce)를 사용할까? 하이브에서 대부분의 쿼리를 실행할 경우 맵리듀스가 사용된다. 하지만 일부 쿼리의 경우 로컬 모드 환경에서 맵리듀스를 사용하지 않고도 쿼리가 동작 할수도 있다. 예를 들어 아래 스크립트 처럼 단순히 테이블을 조회하는 쿼리는 맵리듀스를 사용하지 않는다. select * from tbl_a; 단순히 SELECT와 같은 쿼리는 하이브가 테이블로 부터 레코드를 읽고 형식에 맞춰서 콘솔로 출력한다. 이 경우 맵리듀스 작업대신 파일에서 Fetch Task로 전체 데이터를 가져온다. 마치 아래 하둡 명령과 유사하다. hadoop fs -cat $ file_name ..

Hive에서 SELECT 결과를 테이블로 INSERT 하기

Hive에서 SELECT 결과를 테이블로 INSERT 하기 · Version : Hive Hive에서 쿼리 결과를 테이블에 입력할때, 이미 존재하는 테이블에 데이터를 입력할수도 있으며, 새로운 테이블을 생성하며 데이터를 입력할 수도 있다. 이미 존재하는 테이블에 SELECT된 결과를 저장할 때는 INSERT 구문을 사용한다. OVERWRITE 예약어를 사용하여 해당 파티션의 데이터를 교체할 수 있다. OVERWRITE 예약어를 INTO로 변경하면 하이브는 데이터를 교체하지 않고 원래 데이터에 추가한다. INSERT OVERWRITE TABLE tbl_new PARTITION (month = '1', day = '1') select * from tbl_origin as origin where origin...

Hive 테이블 삭제, 수정

Hive 테이블 삭제, 수정 · Version : Hive 하이브에서 테이블을 삭제하는 명령은 DROP TABLE 명령어를 사용한다. DROP TABLE IF EXISTS table_name; 테이블을 삭제할때, 하둡의 휴지통기능이 활성화되어 있으면 데이터는 분산 파일 시스템의 .Trash 디렉터리로 이동된다. 휴지통 기능에 설정된 시간이후 데이터가 완전히 삭제 된다. 휴지통 기능이 비활성화 되어 있는 경우 즉시 삭제된다. 또한 삭제하려는 테이블이 외부 테이블인경우, 테이블의 메타데이터만 삭제되며 데이터는 그대로 남아있다. 테이블 수정은 ALTER TABLE 명령을 사용하여 변경한다. 테이블 수정은 메타데이터만 변경할 뿐 데이터 자체는 변경시키지 않는다. [테이블명 변경] Table_name 테이블명을 ..

2020-07-04 Big Bear Lake Camping (빅베어 호수 캠핑)

2020-07-04 Big Bear Lake Camping (빅베어 호수 캠핑) - Serrano campground 2020년 7월 4일, LA에서 약 2시간 거리인 빅베어 호수(Big Bear Lake)로 캠핑을 떠낫다. 지난 캠핑을 다년온후 1주일만에 다시 떠나는 캠핑이어서 그런지, 쉽게 준비가 되었다. 우스갯 소리로, “삼대가 덕을 쌓아야 7월4일(미국 독립 기념일)에 스팟을 예약할 수 있다”고 했는데, 매일 같이 예약 사이트를 리프레시 하면서 취소된 스팟을 잡을 수 있었다. 그것도 매우 좋은 자리로! 1박2일 일정으로 캠핑을 하였고, 낮에는 매우 더우면서도 밤에는 매우 추웠으며(고도 7000ft), 일주일 정도 머무르면서 호숫가 산책과 생각하는 시간을 가지고 싶은 장소였다. 특히 겨울에는 눈이 ..

Kang's Life 2020.07.06

2020-06-27 Joshua Tree National Park Camping(조슈아트리 국립공원)

2020-06-27 Joshua Tree National Park Camping(조슈아트리 국립공원) - Indian Cove campground 2020년 6월 27일, COVID19로 인한 Stay at Home이 3개월이 지난 시점에서, 일부 사이트들이 오픈하면서 캘리포니아에 위치한 조슈아트리 국립공원에서 캠핑을 했다. 운좋게 사이트가 오픈한는날 캠핑을 계획하여서 바로 스팟을 예약할수 있었다. 어릴때 보이스카웃 외에 처음하는 캠핑이어서 (심지어 군대에서도 텐트에서 자본적이 없다.) 많은 준비와 함께 설레는 마음으로 캠핑을 기대하였으나, 사막의 뜨거운 기후와, 태풍급으로 부는 바람으로 인해서 험난하고도 기억에 남는 캠핑이었다. 국립공원 입구는 아닌데, (대부분 입구 간판을 찍었는데 난 바보같이 이걸 ..

Kang's Life 2020.07.06

Hive 파티션 테이블에서 where 없는 쿼리 실행 방지

Hive 파티션 테이블에서 where 없는 쿼리 실행 방지 · Version : Hive 하이브에서 테이블 파티셔닝을 하는 가장 큰 이유는 빠르게 데이터를 검색하기 위해서이다. 아주 큰 데이터가 있더라도 파티션 스키마가 검색하려는 범위 필터링을 반영한다면 파티셔닝 테이블은 쿼리의 성능을 극적으로 올려준다. 그래서 특정값을 필터하는 WHERE 절에 파티션 조건을 포함하는데 이러한 조건을 “파티션 필터”라고 부른다. 그러나 파티셔닝이 잘 되어 있다고 하더라도, 테이블 데이터가 많거나 파티션 개수가 많다면 거대한 맵리듀스 작업을 유발할 수 있다. 이러한 맵리듀스의 부하를 방지하기 위해 WHERE 절에 파티션 필터가 없는경우 쿼리 실행이 되지 않도록 옵션을 설정할 수 있다. 아래 스크립트는 WHERE절에 파티션..