실무사례 실무사례 구축 2016-09-30 CBU / MIS 1 1. DW 요구사항 분석 Sales 전략을 수립하고 실행을 담당하는 Sales Manager는 다양한 분석을 기반으로 의사 결정을 수행하기 위하여 회사의 자재 (materials), 고객(customers), 판매 조직(sales organizations)에 대한 정보와 판매기록에 관한 정보를 (1)~(4)의 sample data와 같이 관리한다. (1) Material Tables
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
– 각 테이블은 데이터가 어떻게 저장되는지를 결정하는 하나 이상의partition Keys를 가질 수 있음
• Buckets (or clusters)
– 각 파티션의 데이터는 컬럼의 해쉬함수 값을 기반으로 buckets 단위로 나뉘어짐
2012-11-00 29
HiveQL - 데이터 정의
2012-11-00 30
Hive Database
hive> CREATE DATABASE financialshive> CREATE DATABASE IF NOT EXISTS financialshive> SHOW DATABASESdefaultfinancialshive> CREATE DATABASE human_resourceshive> SHOW DATABASESdefaultfinancialshuman_resourceshive> SHOW DATABASES LIKE 'h.*'human_resourceshive> ...
- Hive는 각 데이터베이스에 대하여 하나의 디렉토리를 생성하고(: DB_directory),
그 데이터베이스에서 생성한 테이블들은 DB_directory의 서브 디렉토리에 저장함
- 다만, default database에 속하는 테이블들은 자신의 디렉토리를 가지지 않음
- Hive Database는 단지 테이블들의 카탈로그 혹은 name space (테이블 이름의 충돌을막는 방안)로 간주될 수 있음
HiveQL - 데이터 정의
2012-11-00 31
Managed table (or internal table)
- Hive가 테이블 내의 데이터 대한 수명을 관리하는 테이블로써 internal table이라고도 함
- 지금까지 설명한 테이블은 모두 managed table 임
- Hive가 데이터 파일을 관리하며, 테이블 삭제시 메타 정보와 파일을 함께 삭제함
- hive.metastore.warehouse.dir 에 정의된 디렉토리 (e.g.,
/user/hive/warehouse,by default)의 서브 디렉토리로 이들 테이블 데이터를 저장함
- drop table 명령어로 테이블 내의 모든 데이터가 삭제됨
External table
- Hive가 데이터를 소유하지 않고 기존 파일을 테이블의 데이터로 사용하는 테이블로써 테이블
생성시 External 이라는 키워드를 사용함
- Hive는 그 테이블에 대한 메타 데이터만 가지고 있다가 drop table 명령어가 실행되면
데이터는 그대로 두고 Hive meta data 내에서 그 테이블에 대한 정보만 지움
HiveQL - 데이터 정의
2012-11-00 32
- 예제 : 테이블 생성CREATE TABLE employees (
name STRING,salary FLOAT,subordinates ARRAY<STRING>,deductions MAP<STRING, FLOAT>,address STRUCT<street:STRING, city:STRING,
state:STRING, zip:INT>);
HiveQL - 데이터 정의
2012-11-00 33
파티셔닝된 managed table (external table도 파티셔닝이 가능함)
- 특정한 속성값을 기준으로 데이터를 분할하여 저장하는 테이블로써그 속성에 대한 조건을 빠르게 처리할 수 있게 됨
- 데이터를 첫 번째 country, 두 번째 state의 값을 기준으로 파티션하는 예제CREATE TABLE employees (
name STRING,salary FLOAT,subordinates ARRAY<STRING>,deductions MAP<STRING, FLOAT>,address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)PARTITIONED BY (country STRING, state STRING);
Hive는 파티셔닝을 위해 다음과 같은 서브 디렉토리들을 생성하게 됨 (country, state 값의 조합)....../employees/country=CA/state=AB.../employees/country=CA/state=BC....../employees/country=US/state=AL.../employees/country=US/state=AK...
Cloud/hadoop의 분산파일 시스템과 연계
HiveQL - 데이터 정의
2012-11-00 34
- 다음 질의는 실제로 하나의 디렉토리 (...country=US/state=IL)만 탐색하면 질의
결과를 구할 수 있게 되므로 성능이 매우 좋음 (필터링 효과가 큼)
SELECT * FROM employees
WHERE country = 'US' AND state = 'IL';
- 그러나 모든 파티션을 탐색해야 하는 질의에서 파티션의 개수가 많다면 (where 절의
조건에서 필터링 효과가 매우 적은 경우) 거대한 MR 작업을 수반하므로 속도가 저하가 우려됨;
- map/reduce 모드를 다음과 같이 “strict”로 설정함으로써 지나친 오버헤더를 유발하는
질의를 금지시킬 수 있음
hive> set hive.mapred.mode=strict;
hive> SELECT e.name, e.salary FROM employees e LIMIT 100;
FAILED: Error in semantic analysis: No partition predicate found for
Alias "e" Table "employees"
<== strict mode 인 경우 where 절에 파티션에 대한 필터링 조건을 주어야 함
Hive Data Loading
2012-11-00 35
(1) create table statement :create table emp5(
name string,salary float)
partitioned by (country string, state string)row format delimited fields terminated by ',';
(2) data file 준비Cho, 40000Park, 5000Kim, 30000Lee, 25000
(3) Hive 데이터 로딩hive> load data local inpath 'data_emp5' into table emp5> partition (country = 'Korea', state = 'Chungbuk');
(4) 확인hive>> select * from emp5;
OKCho 40000.0 Korea ChungbukPark 5000.0 Korea ChungbukKim 30000.0 Korea ChungbukLee 25000.0 Korea ChungbukTime taken: 0.1 seconds, Fetched: 4 row(s)\
데이터 로딩의 예제
Hive Data Loading
2012-11-00 36
데이터 값의 텍스트 파일 인코딩
• 데이터 파일에서 필드 구분자로 쉼표나 탭을 사용할 수 있지만 데이터 자체에 쉼표나 탭이 있을 경우 혼선
name STRING,salary FLOAT,subordinates ARRAY<STRING>,deductions MAP<STRING, FLOAT>,address STRUCT<street:STRING, city:STRING,
state:STRING, zip:INT>)PARTITIONED BY (country STRING, state STRING);
- 간단한 질의의 예hive> SELECT name, salary FROM employees;John Doe 100000.0Mary Smith 80000.0Todd Jones 70000.0Bill King 60000.0
HiveQL - 질의어
2012-11-00 40
- Collection type을 선택하는 질의 (subordinates : array) :JSON (Java Script Object Notation) 구문으로 결과를 표시함
hive> SELECT name, subordinates FROM employees;John Doe ["Mary Smith","Todd Jones"]Mary Smith ["Bill King"]Todd Jones []Bill King []
- Collection type을 선택하는 질의 (deduction : map)
hive> SELECT name, deductions FROM employees;
John Doe {"Federal Taxes":0.2, "State Taxes":0.05, "Insurance":0.1}Mary Smith {"Federal Taxes":0.2, "State Taxes":0.05, "Insurance":0.1}Todd Jones {"Federal Taxes":0.15, "State Taxes":0.03, "Insurance":0.1}Bill King {"Federal Taxes":0.15, "State Taxes":0.03, "Insurance":0.1}
HiveQL - 질의어
2012-11-00 41
- Collection type을 선택하는 질의 (address : struct)hive> SELECT name, address FROM employees;
John Doe {"street":"1 Michigan Ave.","city":"Chicago","state":"IL","zip":60600}Mary Smith {"street":"100 Ontario St.","city":"Chicago","state":"IL","zip":60601}Todd Jones {"street":"200 Chicago Ave.", "city":"OakPark","state":"IL", "zip":60700}Bill King {"street":"300 ObscureDr.","city":"Obscuria","state":"IL","zip":60100}
- Collection type/array에서 특정 항목을 참조하는 방법(index는 0-based); 결과가 없으면 NULL로 displayhive> SELECT name, subordinates[0] FROM employees;
John Doe Mary SmithMary Smith Bill KingTodd Jones NULLBill King NULL
HiveQL - 질의어
2012-11-00 42
- Collection type/map 타입의 컬럼에서 항목 참조하기: index 대신에 key values를 사용하여 특정 항목을 지정함
hive> SELECT name, deductions["State Taxes"] FROM employees;John Doe 0.05Mary Smith 0.05Todd Jones 0.03Bill King 0.03
- Collection type/struct 타입의 컬럼에서 항목 참조하기: "dot" 표기법 사용
hive> SELECT name, address.city FROM employees;John Doe ChicagoMary Smith ChicagoTodd Jones Oak ParkBill King Obscuria
HiveQL - 질의어
2012-11-00 43
Nested SQL
HiveQL - 질의어
2012-11-00 44
- 예제 : select list의 세 번째 항목을 case 문에서 조건으로 결정함hive> SELECT name, salary,
> CASE> WHEN salary < 50000.0 THEN 'low'> WHEN salary >= 50000.0 AND salary < 70000.0 THEN 'middle'> WHEN salary >= 70000.0 AND salary < 100000.0 THEN 'high'> ELSE 'very high'> END AS bracket FROM employees;
John Doe 100000.0 very highMary Smith 80000.0 highTodd Jones 70000.0 highBill King 60000.0 middleBoss Man 200000.0 very highFred Finance 150000.0 very highStacy Accountant 60000.0 middle...
HiveQL - 질의어
2012-11-00 45
- stocks 테이블 구조
CREATE EXTERNAL TABLE IF NOT EXISTS stocks (exchange STRING,symbol STRING,ymd STRING,price_open FLOAT,price_high FLOAT,price_low FLOAT,price_close FLOAT,volume INT,price_adj_close FLOAT
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','LOCATION '/data/stocks';
실무예제- stocks (증시) 테이블과 dividend (배당) 테이블을 생성하고, 데이터를 로딩함