메모장

빅데이터 분산 컴퓨팅 정리(9~14강 HIVE관련) 본문

교육(KOCW, 오프라인)/빅데이터분산컴퓨팅(하둡에코시스템)

빅데이터 분산 컴퓨팅 정리(9~14강 HIVE관련)

hiandroid 2017. 9. 5. 10:59
반응형

하둡

Hadoop - HDFS -> 스토리지 담당

Hadoop - MapReduce -> 계산 담당


흐름

Job = HDFS에서 read -> <K,V> key,value형식 -> Mapper에서 key,value쌍의 형태로 데이터를 읽음 -> Shuffle로 합침 -> [<K,V>] key,value쌍을 list로 만듬Reduce -> <K,V> -> HDFS파일로 write


MapReduce는 java나 python으로 개발

개발Task(driver, mapper, reducer)


HIVE

탄생배경

 - 맵리듀스 프로그래밍은 데이터분석가들이 하기에는 너무 어려움

 - 재사용불가, 에러발생율 높음

 - 데이터분석가들은 프로그래밍은 못하지만 sql은 사용가능


페이스북에서 HQL이라는 SQL과 유사한 언어로 맵리듀스를 대체할 HIVE를 개발

비구조적인 데이터들을 테이블처럼 보이게해 hql을 사용할 수 있도록 함


흐름

hql 쿼리 -> HIVE에서 해당쿼리문을 MapReduce로 변환 <-> MapReduce <-> HDFS



즉, 사용자는 쿼리문을 사용하면 자동으로 hive에서 쿼리문을 MapReduce프로그래밍으로 변환해줌


장점

 - 대용량 데이터 쉽게처리

 - SQL제공(hiveQL)

 - 맵리듀스를 직접 작성하는 것보다 생산적(java로 100line을 hiveQL로 5line으로 구현가능)

 - 많은 BI툴들이 hive 지원


단점

 - 데이터 추가 방법이 쉽지않음

 - HDFS안의 파일은 수정불가


HIVE는 Client machine에서 동작

 - hiveQL질의문을 MapReduce job으로 변환


스키마란?

name        id            dept

string     integer     string

field구성을 뜻함


인스턴스란?

홍길동 23 컴퓨터공학

최xx    57  생명공학

데이터를 뜻함


스쿱

하둡과 RDBMS의 데이터를 변환해주는 에코시스템

스쿱에서 RDBMS의 형식을 HDFS로, HDFS를 RDBMS로 데이터 마이그레이션 해줌

HDFS <-> SQOOP <-> RDBMS




ex. 

소비자들의 제품평가가 가장 불만족한 제품을 찾아내고, 그제품에 대해 다양한 키워드들을 분석하여 문제점의 요인을 찾아내기 위함


step1 : 제품들의 대한 ratings의 수치를 분석

- 사용자로부터 comment의 개수가 많고, 실제제품도 만족한 제품(comment개수 > 50, 평점 high)

- comment의 개수는 많지만 제품에 대한 만족도가 낮은 제품(comment개수 > 50, 평점 low)


step2 : 가장평가가 안좋은 제품에 대한 평점 comments 분석

- 그 제품의 comments에서 가장 많이 나타난 문장 추출(e.g 2-gram, 3-gram)

- 가장 많이 나타난 문장들을 포함하고 있는 comments 추출(e.g "ten times more", "red", "16gb usb flash driver")



Sentiment 분석예제를 위한 ratings테이블 생성


hive> CREATE TABLE ratings

(posted TIMESTAMP, cust_id INT, prod_id INT, rating INT, message STRING)

ROWFORMAT DELIMITED

FIELDS TERMINATED BY '\t';


HDFS에 경로 생성후 파일 업로드

$hadoop fs -mkdir ratings

$hadoop fs -put ratings_2013.txt ratings


테이블에 데이터 로드

hive> LOAD DATA INPATH 'ratings' INTO TABLE ratings;



목표

 - 평가횟수가 50개 이상인 제품

 - 평점이 높은 순으로 정렬


hive> SELECT prod_id, FORMAT_NUMBER(avg_rating, 2) AS avg_rating

FROM (SELET prod_id, AVG(rating) AS avg_rating, COUNT(*) AS num

FROM ratings

GROUP BY prod_id) rated

WHERE num >= 50

ORDER BY avg_rating DESC

LIMIT 1

;


Inner query(= sub query, nested query)


목표 step1

 - 가장 문제가 되는 제품을 찾기

- 평가횟수가 50개 이상인 제품

- 평점이 낮은 순으로 정렬


hive> SELECT prod_id, FORMAT_NUMBER(avg_rating, 2) AS avg_rating

FROM (SELECT prod_id, AVG(rating) AS avg_rating, COUNT(*) AS num

FROM ratings

GROUP BY prod_id) rated

WHERE num >= 50

ORDER BY avg_rating

LIMIT 1

;


레이팅 테이블에서 제품id와 평균, 평가횟수를 찾고

평균을 소수점2째자리까지 표시하고

평가횟수 50이상이고

평점은 낮은순으로

1개만 출력


목표 step2


EXPLODE를 사용하여 Array를 Records변환


EXPLODE함수는 array의 각 element마다 하나의 record생성

 - SPLIT과 같은 함수는 table generating function임

 - table generating function을 EXPLODE의 파라미터로 사용할때는 alias필요


ex.

hive> SELECT people FROM example;

 - Amy,Sam,Ted


hive> SELECT SPLIT(people, ',') FROM example;

 - ["Amy", "Sam", 'Ted"]


hive> SELECT EXPLODE(SPLIT(people, ',')) AS x FROM example;

 - Amy

 - Sam

 - Ted


n-grams

 - n-gram은 단어의 조합(n = number of words)

- bigram은 연속된 두 단어의 조합(n = 2)

 - 검색엔진에서 많이 사용


HIVE에서의 n-gram

 - hive에서는 n-gram을 계산하기 위한 NGRAMS함수 제공

 - NGRAMS함수는 3개의 파라미터 필요

 - Output은 2개의 속성을 가진 STRUCT구조의 array리턴

- ngram: n-gram 자체값

- estfrequency: n-gram의 각 값이 몇번 나타났는지에 대한 count값



Sentences를 Words로 변경

 - hive의 SENTENCES함수는 sentences를 array of words로 변환

ex.

hive> SELECT txt FROM phrases WHERE id=12345;

 - I bought this ...


hive> SELECT SENTENCES(txt) FROM phrases WHERE id=12345;

 - [["I","bought","this",...]]

반응형