- Published on
Apache Hive Query example (MovieLens)
- Authors
- Name
Overview
일반적으로 HDFS의 데이터를 다루는 법은, Mapreduce 프로그램을 작성하는 것이다. Mapreduce는 자유도는 높지만, 제대로 사용하기 위해서는 많은 공부와 시행착오가 필요하다. 그리고 가장 큰 단점은, 어렵다. 따라서 생산성이 낮다. Hive는 개발자에게 친숙한 SQL을 작성하면, 이를 Mapreduce 잡으로 변경해준다. (최근에는 Hive의 엔진으로 Mapreduce가 아니라 훨씬 빠른 Spark 또는 Tez 를 사용한다고 한다.)위에서 따라서 SQL만 아는 개발자여도 HDFS상의 데이터를 저장하거나, 조회하거나 유용한 정보를 추출할 수 있게된다. Movie Lens에서 제공하는 데이터를 이용해 Hive Query로 데이터를 다뤄보며, Hive가 얼마나 유용한지 살펴보자.
데이터 준비
다운로드
그룹렌즈라는 사이트에서 제공하는 https://grouplens.org/datasets/movielens/에서 제공하는 100k 데이터를 사용한다.
wget https://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
hadoop fs -cp ml-100k/u.data /tmp
Hive 테이블 생성
hive shell을 실행해 주고, 아래와 같은 명령어로 u_data 테이블을 생성한다.
use default
CREATE TABLE IF NOT EXISTS u_data(
userid INT,
movieid INT,
rating INT,
unixtime TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
LOAD DATA INPATH 'hdfs:///tmp/u.data' overwrite into table u_data;
u_data 테이블이 잘 생성되었는지 확인한다.
hive> show databases;
OK
default
userdb
Time taken: 0.312 seconds, Fetched: 2 row(s)
hive> use default;
OK
Time taken: 0.023 seconds
hive> show tables;
OK
u_data
Time taken: 0.044 seconds, Fetched: 1 row(s)
hdfs 상에서도 해당 테이블이 잘 생성되었는지 확인한다.
root@ubuntu01:~# hdfs dfs -ls /user/hive/warehouse
Found 2 items
drwxr-xr-x - root supergroup 0 2022-11-22 18:52 /user/hive/warehouse/u_data
drwxr-xr-x - root supergroup 0 2022-11-22 18:43 /user/hive/warehouse/userdb.db
Query
table schema
hive> describe u_data;
OK
userid int
movieid int
rating int
unixtime timestamp
Time taken: 0.087 seconds, Fetched: 4 row(s)
row count
u_data
라는 테이블에 총 몇 개의 row 가 있는지 출력하는 쿼리를 날려보자.
hive> select count(*) from u_data;
OK
100000
Time taken: 20.914 seconds, Fetched: 1 row(s)
u_data 테이블에는 100k(10만개의) row가 있음을 확인할 수 있다.
distinct movieid
hive> select count(distinct movieid) from u_data;
OK
1682
영화 종류
distinct명령어를 통해 movieid의 갯수를 구할 수 있다.
hive> select count(distinct movieid) from u_data;
OK
1682
영화별 평점
영화별 평점 평균을 구하기 위해서는 아래와 같은 명령어를 사용할 수 있다. GROUP BY
명령어를 통해 집계 연산을 수행할 수 있다.
hive> select movieid, avg(rating) from u_data group by movieid;
영화별 평점 순위
SORT BY my_column (ASC|DESC)
명령어를 사용하면 my_column 컬럼 기준으로 내림차순 정렬 및 출력이 가능하다.
hive> select movieid, avg(rating) as avg_rating from u_data group by movieid sort by avg_rating DESC;