Published on

Apache Hive Query example (MovieLens)

Authors
  • Name
    Twitter

Overview

일반적으로 HDFS의 데이터를 다루는 법은, Mapreduce 프로그램을 작성하는 것이다. Mapreduce는 자유도는 높지만, 제대로 사용하기 위해서는 많은 공부와 시행착오가 필요하다. 그리고 가장 큰 단점은, 어렵다. 따라서 생산성이 낮다. Hive는 개발자에게 친숙한 SQL을 작성하면, 이를 Mapreduce 잡으로 변경해준다. (최근에는 Hive의 엔진으로 Mapreduce가 아니라 훨씬 빠른 Spark 또는 Tez 를 사용한다고 한다.)위에서 따라서 SQL만 아는 개발자여도 HDFS상의 데이터를 저장하거나, 조회하거나 유용한 정보를 추출할 수 있게된다. Movie Lens에서 제공하는 데이터를 이용해 Hive Query로 데이터를 다뤄보며, Hive가 얼마나 유용한지 살펴보자.

데이터 준비

다운로드

그룹렌즈라는 사이트에서 제공하는 https://grouplens.org/datasets/movielens/에서 제공하는 100k 데이터를 사용한다.

grouplense
wget https://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
copy-to-hdfs
hadoop fs -cp ml-100k/u.data /tmp

Hive 테이블 생성

hive shell을 실행해 주고, 아래와 같은 명령어로 u_data 테이블을 생성한다.

create-table
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

u_data
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;

Reference