6. 데이터 분석 실습(Hive)
6.1 Hadoop 기반의 기술들
6.1.1 MapReduce
6.1.2 Hadoop streaming
펄, 파이썬 등의 다른 언어로 개발
6.1.3 Hive
HiveQL로 개발 (페이스북)
6.1.4 Pig
pig script로 개발 (트위터)
6.2 Hive
6.2.1 하둡 기반에서 실행되는 라이브러리
6.2.2 자바 코드 대신 SQL 구문을 사용(HiveQL)
Hive 2에서 MapReduce 방식의 실행은 아직 가능하나 향후 버전에서는 더이상 지원되지 않을 수 있으므로 Tez, Spark 등의 다른 분산처리 라이브러리를 사용하거나 Hive 1 버전 사용을 권고하고 있음.
6.3 Hive 설치
6.3.1 다운로드
hive-2.3.2-bin.tar.gz 압축파일을 /home/centos/hive-2.3.2 에 복사
6.3.2 MySQL 설치(윈도우즈에 설치)
6.3.3 HIVE_HOME을 환경변수에 추가
gedit /etc/profile
export HIVE_HOME=/home/centos/hive-2.3.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
변경 사항 적용 및 재부팅
source /etc/profile
reboot
복사하여 붙여넣기를 하다가 에러가 날 경우 우선 메모장에 붙인 후 다시 터미널에 리눅스에 붙어넣으면 잘 됨, 그래도 에러가 나면 한줄로 만든 후 붙이면 잘 됨 sql의 경우 여러 라인을 붙이는 것도 가능하나 라인 앞부분에 공백이 있으면 에러가 발생할 수 있으므로 주의.
6.3.4 hive-env.sh 수정
gedit $HIVE_HOME/conf/hive-env.sh
hive-env.sh 48번 라인 수정
HADOOP_HOME=/home/centos/hadoop-2.9.0
6.3.5 mysql-connector-java-5.1.46-bin.jar 파일을 lib 디렉토리에 복사
6.3.6 conf/hive-sitr.xml 생성
gedit $HIVE_HOME/conf/hive-site.xml
<?xml ver...
<value>jdbc:mysql://mysql_ip:3306/hive?useSSL=false&
6.4 Hive 실습
6.4.1 metastore 초기화 작업
hive를 실행하기 전에 metastore를 초기화시켜야 함
mysql에서 데이터베이스 생성(윈도우즈의 HeidiSQL에서 실행)
CREATE DATABASE Hive;
metastore 초기화 작업
schematool -initSchema -dbType mysql
에러가 날 경우 mysql 데이터베이스 삭제 후 다시 만들기(윈도우즈의 HeidiSQL에서 실행)
DROP DATABASE Hive;
CREATE DATABASE Hive;
6.4.2 hdfs 디렉토리 생성
hdfs dfs -mkdir /tmp
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hive
hdfs dfs -mkdir /user/hive/warehouse
hdfs dfs -chmod g+x /tmp
hdfs dfs -chmod g+x /user/hive
hdfs dfs -chmod g+x /user/hive/warehouse
6.4.3 hive 실행
hive
6.4.4 HiveQL 실습
테이블 만들기(대소문자 구분없이 작성)
CREATE TABLE Dept (
dname STRING,
loc STRING,
deptno INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
CREATE TABLE Emp (
empno INT,
ename STRING,
job STRING,
mgr INT,
hiredate STRING,
sal INT,
comm INT,
deptno INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
CREATE TABLE Salgrade (
grade INT,
losal INT,
hisal INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
show tables;
load data local inpath '/home/centos/data/emp/dept.csv'
overwrite into table dept;
load data local inpath '/home/centos/data/emp/emp.csv'
overwrite into table emp;
load data local inpath '/home/centos/data/emp/salgrade.csv'
overwrite into table salgrade;
set hive.cli.print.header=true;
select * from emp;
select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno
and e.job like '%CLERK%';
select deptno, count(*) cnt, sum(sal) sum_sal, avg(sal) avg_sal from emp
group by deptno
order by deptno;
항공운항 테이블 만들기
create table ontime (
year int,
month int,
)
6.4.5 Hive 테이블에 자료 업로드
csv 파일의 첫라인 제거
sed -e '1d' 2006.csv > 2006_new.csv
sed -e '1d' 2007.csv > 2007_new.csv
sed -e '1d' 2008.csv > 2008_new.csv
csv 파일의 자료를 hive 테이블로 insert (hive에서 실행)
load data local inpath '/home/centos/data/airline/2006_new.csv'
overwrite into table ontime
partition (delayyear = '2006');
load data local inpath '/home/centos/data/airline/2007_new.csv'
overwrite into table ontime
partition (delayyear = '2007');
load data local inpath '/home/centos/data/airline/2008_new.csv'
overwrite into table ontime
partition (delayyear = '2008');
확인(hive에서 실행)
limit 라인수(라인수를 제한함)
select * from ontime limit 10;
6.4.6 2006~2008년의 도착지연건수 조회
select year, month, count(*)
from ontime
where depdelay > 0
group by year, month
order by year, month;
파일 목록 확인
hdfs dfs -ls /user/hive/warehouse/ontime
6.4.7 2008년도의 도착지연건수 조회
select year, month, count(*) as arrive_delay_count
from ontime
where delayyear = 2008 and arrdelay > 0
group by year, month
order by year, month;
6.4.8 테이블 조인 실습
항공사 테이블
문자열 필드의 따옴표 제거
find . -name carriers.csv -exec perl -p -i -e 's/"//g' {} \;
create table(hive에서 실행)
create table carrier_code(code string, description string) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
load data(hive에서 실행)
load data local inpath '/home/centos/data/airline/carriers.csv' overwrite into table carrier_code;
join query (hive에서 실행)
select a.year, a.
6.4.9 3개 이상의 테이블을 조인
공항데이터의 따옴표 제거
cd /home/centos/data/airline
find . -name airports.csv -exec perl -p -i -e 's/"//g' {} \;
airport_code 테이블 생성
create ta
데이터 import
load data local inpath
3개 테이블 조인
select a.year,