Hive | 基于Python预处理、用Hive对movielens数据集进行分析

概述

熟悉Hive的小伙伴都知道,企业中对Hive进行数据预处理ETL,最多的是用UDF和Python脚本。本文主要是实践在Hive中使用Python脚本进行数据清洗。数据集来源:http://files.grouplens.org/datasets/movielens/

当然,下面的分析内容如果用spark,一句就搞定了。

需求分析

ml-100k中的数据有四个字段,分别对应:userId(用户id),movieId(电影id),rate(评分),time(观影时间),前几条数据预览如下图。
Hive | 基于Python预处理、用Hive对movielens数据集进行分析_第1张图片
预览过数据后,发现第四个字段,即time的格式不是我们日常所见的格式,不利于我们做数据分析。所以有必要对它进行数据预处理。

原始表创建和导入数据

  • 在Linux上下载数据包:wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
  • 使用unzip解压数据包:unzip ml-100k.zip
  • hql操作
    CREATE TABLE if not exists u_data(
    userid INT,
    movieid INT,
    rating INT,
    unixtime STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    STORED AS TEXTFILE;
    
    LOAD DATA LOCAL INPATH '/opt/datas/ml-100k/u.data' OVERWRITE INTO TABLE u_data;
    

数据预处理

(1)编写Python脚本

关于Python的语法不在这里叙述,下面的语句并不难理解。
touch weekday_mapper.py;

import sys
import datetime

for line in sys.stdin:
  line = line.strip() # 表中的一行数据作为一行字符串输入
  userid, movieid, rating, unixtime = line.split('\t')	# 以tab分割
  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()	# 转换操作
  print '\t'.join([userid, movieid, rating, str(weekday)])	# 用tab拼接并输出

(2)创建新表

新表和原始表的区别是,第四个字段用weekday int,在插入数据时使用Python脚本把原始的数值转换为我们要的目标格式的weekday

CREATE TABLE u_data_new (
  userid INT,
  movieid INT,
  rating INT,
  weekday INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

(3)重点:hql中使用脚本

  • 先添加脚本文件,类似于UDF中添加jar
    add FILE /opt/datas/weekday_mapper.py;
  • 使用脚本
    INSERT OVERWRITE TABLE u_data_new
    SELECT 
    	TRANSFORM (userid, movieid, rating, unixtime)  -- 从原表中插入
    	USING 'python weekday_mapper.py'  -- 使用python脚本
    	AS (userid, movieid, rating, weekday) -- 从脚本里输出的值
    FROM u_data;
    # 实际使用中,执行以上命令式,不能有注释,也不需要用tab缩进。
    

hql数据分析

对每周观影人数进行统计并排序:SELECT weekday, COUNT(1) cnt FROM u_data_new GROUP BY weekday order by cnt desc;
查询结果如下:

Hive | 基于Python预处理、用Hive对movielens数据集进行分析_第2张图片可以看出,周六观影的人数最多。

你可能感兴趣的:(Hadoop系列)