Hive : DDL, DML, SQL Operations
2011/02/23 Leave a comment
DDL Operation
하이브 테이블을 만들고 결과를 보여준다.
두 개의 컬럼이 있는 pokes 테읍ㄹ을 생성한다. 첫 번째는 정수, 두 번째는 문자열이다.
두개의 컬럼을 가지고 한 개의 파티션 컬럼을 가지는 invites 테이블은 생성한다. 파티션 걸럼은 가상 컬럼이다. 이것은 데이타 자체의 일부분이 아니다. 특별한 데이터 셋이 로드되는 파티션으로 부터 유래한다.
디폴트로 테이블들은 text input format이고 구분자는 ^A(crt-a)라고 가정한다.
테이블의 목록을 보여준다.
‘s’로 끝나는 테이블의 모든 목록을 보여준다. 이 패턴 매칭은 Java regular expressions을 따른다.
컬럼의 목록을 보여준다.
테이블 변경에서 테이블 이름은 변경될 수 있다. 그리고 추가 컬럼도 drop 될 수 있다.
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT ‘a comment’);
hive> ALTER TABLE events RENAME TO 3koobecaf;
테이블 drop
Metadata Store
메타데이터는 javax.jdo.option.ConnectionURL 의 이름의 하이브 설정 변수에 의해 디스크 스토리의 위치 결정되는 임베디드 더비 데이터베이스이다. 초기 값은 ./metasore_db 이다.
메타스토어는 JPOX를 지원하는 어떤 데이타베이스에도 저장될 수 있다. 위치와 RDBMS의 타입은 javax.jdo.option.ConnectionURL 과 javax.jdo.option.ConnectionDriverName 두 변수에 의해서 조정된다.
지원하는 데이터베이스들의 좀 더 자세항 사항은 JDO(또는 JPOX) 문서를 참조해라 테이터베이스 스키마는 src/contrib/hive/metasore/src/model에 있는 JDO 메타데이터 어노테이션 파일 package.jdo 에 정의 되어 있다.
향후에는 메타스토어 자체가 stand-alone 서버가 될 것이다.
DML Operation
flat 파일의 데이타를 Hive로 로드한다.
ctrl-a 로 나눠진 두 컬럼 포함하는 파일을 pkes 테이블로 로드한다. ‘local’ 이라고 명시하는 것은 입력파일이 로컬 파일 시스템에 있다는 것이다. ‘local’을 빼면 HDFS 에 있는 파일을 찾는다. ‘overwrite’ 키워드는 테이블의 기존의 데이타는 삭제됨을 명시한다. ‘overwrite’ 키워드가 빠지면 데이터 파일은 기존 데이터 셋에 추가된다.
알아야 할 점
- 로드 커맨드에 수행되는 스키마에 대한 데이터 검증(verification)은 없다
- 만약 HDFS에 파일이 있다면 그것은 Hive-controlled 파일 시스템 네임스페이스로 이동한다.
하이브 디렉토리의 루트는 hive-default.xml 파일에 hive.metastore.warehouse.dir 옵션에 의해 지정된다. 하이브에서 테이블을 생성하기 전에 이 디렉토리를 만들 것을 사용자에게 충고한다
hive> LOAD DATA LOCAL INPATH ‘./.examples/files/kv3.txt’ OVERWRiTE INTO TABLE invites PARTITION (ds=’2008-08-08’);
위에 두 개의 LOAD 명령은 invites 테이블의 두 개의 다른 파티션으로 데이터를 로드한다. invites 테이블은 ds 키에 의해서 파티션되어 생성된다.
위에 커맨드는 HDFS 파일/디렉토리로 부터 데이터를 읽어 table에 로드한다. HDFS로 부터 데이터를 로드하는 것의 결과는 파일/디렉토리로 이동되는 것이다. operation은 거의 즉시 수행된다.
SQL Operation
Example Queries
예제 쿼리는 build/dist/examples/queries에 있다. 더 많은 쿼리는 ql/src/test/queries/positive 에 있다
SELECTS and FILTERS
invites 테이블의 파티션 ds=2008-08-15의 모든 로우에서 foo 컬럼을 선택한다. 결과는 어디에도 저장되지 않는다. 그러나 콘솔 화면에 디스플레이 된다.
다음 예제들에서 INSERT(하이브 테이블이나, 로컬 디렉토리, HDFS 디렉토리)는 선택적이다.
쿼리의 결과를 HDFS 디렉토리에 저장한다. 결과 데이터는 디렉토리 파일 안에 있다. (mapper의 개수의 의존한다)
파티션된 테이블은 항상 WHERE 절에 파티션 선택해야 한다.
pokes 테이블의 모든 로우를 선택하여 로컬 디렉토리로 로드한다.
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
hive> INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/reg_3’ SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY ‘/tmp/reg_4’ select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY ‘/tmp/reg_5′ SELECT COUNT(*) FROM invites a WHERE a.ds=’2008-08-15’;
hive> INSERT OVERWRITE DIRECTORY ‘/tmp/reg_5’ SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/sum’ SELECT SUM(a.pc) FROM pc1 a;
컬럼의 합(SUM), 평균(arg), 최소값(min), 최대값(max)이 사용 될 수 있다.
GROUP BY
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
MULTITABLE INSERT
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds=’2008-04-08′, hr=’12’) SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/dest4.out’ SELECT src.value WHERE src.key >= 300;
JOIN
STREAMING