3.15-3.21 hive项目实战

一、创建表并导入日志数据,引出问题

##建表
hive (default)> create table IF NOT EXISTS default.bf_log_src(
              > remote_addr string,
              > remote_user string,
              > time_local string,
              > request string,
              > status string,
              > body_bytes_sent string,
              > request_body string,
              > http_referer string,
              > http_user_agent string,
              > http_x_forwarded_for string,
              > host string
              > )
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘ ‘
              > stored as textfile;
OK
Time taken: 0.037 seconds

##加载数据
hive (default)> load data local inpath ‘/opt/datas/moodle.ibeifeng.access.log‘ into table default.bf_log_src ;

##select
hive (default)> select * from bf_log_src limit 5 ;

##出现了一个问题,原文件有11列数据,但是此时查出来只有8列

二、使用RegexSerDe处理Apache或者Ngnix日志文件

正则测试网站:http://tool.chinaz.com/regex/

#删除原先的表,并重新创建
hive (default)> drop table IF EXISTS default.bf_log_src;

hive (default)> create table IF NOT EXISTS default.bf_log_src(
              > remote_addr string,
              > remote_user string,
              > time_local string,
              > request string,
              > status string,
              > body_bytes_sent string,
              > request_body string,
              > http_referer string,
              > http_user_agent string,
              > http_x_forwarded_for string,
              > host string
              > )
              > ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.RegexSerDe‘
              > WITH SERDEPROPERTIES (
              >   "input.regex" = "(\"[^ ]*\") (\"-|[^ ]*\") (\"[^\]]*\") (\"[^\"]*\") (\"[0-9]*\") (\"[0-9]*\") (-|[^ ]*) (\"[^ ]*\") (\"[^\"]*\") (-|[^ ]*) (\"[^ ]*\")"
              > )
              > STORED AS TEXTFILE;
OK
Time taken: 0.056 seconds

#加载数据
hive (default)> load data local inpath ‘/opt/datas/moodle.ibeifeng.access.log‘ into table default.bf_log_src ;                                                            

#查询
hive (default)> select * from bf_log_src limit 5 ;

#此时查询出来的数据字段数量就和原文件一样了;
#此时就有了原表,下面就可以根据原表处理数据了;

三、依据原表创建子表及设置orcfile存储和snappy压缩数据

此时假如我们需要对原表中的部分字段进行分析:IP、访问时间、请求地址、转入连接

需要建立一个字表,将需要的字段查询出来,插到子表中;

#建表
hive (default)> drop table if exists default.bf_log_comm ;
OK
Time taken: 0.011 seconds

hive (default)> create table IF NOT EXISTS default.bf_log_comm (
              > remote_addr string,
              > time_local string,
              > request string,
              > http_referer string
              > )
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘
              > STORED AS orc tblproperties ("orc.compress"="SNAPPY");
OK
Time taken: 0.034 seconds

#插入数据
hive (default)> insert into table default.bf_log_comm select remote_addr, time_local, request, http_referer from  default.bf_log_src ;

##查询
hive (default)> select * from bf_log_comm limit 5 ;
#此时我们需要的字段已经被插到了字表中

四、数据清洗之自定义UDF去除数据双引号

源码:

package com.beifeng.senior.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * 1. Implement one or more methods named
 * "evaluate" which will be called by Hive.
 *
 * 2."evaluate" should never be a void method. However it can return "null" if
 * needed.
 * @author root
 *
 */

public class RemoveQuotesUDF extends UDF{

    public Text evaluate(Text str) {
        //validate
        if(null == str) {
            return null;
        }

        if(null == str.toString()) {
            return null;
        }
        //remove
        return new Text (str.toString().replaceAll("\"", "")) ;
    }

    public static void main(String[] args) {
        System.out.println(new RemoveQuotesUDF().evaluate(new Text("\"31/Aug/2015:23:57:46 +0800\"")));
    }
}

添加为function:

hive (default)> add jar /opt/datas/jars/hiveudf2.jar ;
Added /opt/datas/jars/hiveudf2.jar to class path
Added resource: /opt/datas/jars/hiveudf2.jar

hive (default)> create temporary function my_removequotes as "com.beifeng.senior.hive.udf.RemoveQuotesUDF" ;
OK
Time taken: 0.013 seconds

重新插入:

##插入
hive (default)> insert overwrite table default.bf_log_comm select my_removequotes(remote_addr), my_removequotes(time_local),
              > my_removequotes(request), my_removequotes(http_referer) from  default.bf_log_src ;

##查询,引号已经去掉了
hive (default)> select * from bf_log_comm limit 5 ;

五、自定义UDF转换日期时间数据

源码:

package com.beifeng.senior.hive.udf;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * 1. Implement one or more methods named
 * "evaluate" which will be called by Hive.
 *
 * 2."evaluate" should never be a void method. However it can return "null" if
 * needed.
 * @author root
 *
 */

public class DateTransformUDF extends UDF{

    private final SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);

    private final SimpleDateFormat outputFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    /**
     * 31/Aug/2015:00:04:37 +0800
     *
     * 20150831000437
     *
     * @param str
     * @return
     */

    public Text evaluate(Text input) {
        Text output = new Text();

        //validate
        if(null == input) {
            return null;
        }

        if(null == input.toString()) {
            return null;
        }

        String inputDate = input.toString().trim();
        if(null == inputDate) {
            return null;
        }

        try {
            //parse
            Date parseDate = inputFormat.parse(inputDate);

            //tranform
            String outputDate = outputFormat.format(parseDate);

            //set
            output.set(outputDate);

        } catch (Exception e) {
            e.printStackTrace();
        }

        //lower
        return output;
    }

    public static void main(String[] args) {
        System.out.println(new DateTransformUDF().evaluate(new Text("31/Aug/2015:00:04:37 +0800")));
    }
}

添加function:

hive (default)> add jar /opt/datas/jars/hiveudf3.jar ;
Added /opt/datas/jars/hiveudf3.jar to class path
Added resource: /opt/datas/jars/hiveudf3.jar

hive (default)> create temporary function my_datetransform as "com.beifeng.senior.hive.udf.DateTransformUDF" ;
OK
Time taken: 0.013 seconds

重新插入:

##插入
hive (default)> insert overwrite table default.bf_log_comm select my_removequotes(remote_addr), my_datetransform(my_removequotes(time_local)),
              > my_removequotes(request), my_removequotes(http_referer) from  default.bf_log_src ;

##查询,时间已经格式化
hive (default)> select * from bf_log_comm limit 5 ;

六、MovieLens数据分析采用python脚本进行数据清洗和统计

1、准备

下载数据样本:wget http://files.grouplens.org/datasets/movielens/ml-100k.zip

解压:unzip ml-100k.zip

[[email protected]-senior datas]# cd ml-100k

[[email protected]-senior ml-100k]# ls
allbut.pl  README   u1.test  u2.test  u3.test  u4.test  u5.test  ua.test  ub.test  u.genre  u.item        u.user
mku.sh     u1.base  u2.base  u3.base  u4.base  u5.base  ua.base  ub.base  u.data   u.info   u.occupation

[[email protected]-senior ml-100k]# head u.data
userid moveid rate    time
196    242    3    881250949
186    302    3    891717742
22     377    1    878887116
244    51     2    880606923
166    346    1    886397596
298    474    4    884182806
115    265    2    881171488
253    465    5    891628467
305    451    3    886324817
6      86     3    883603013

2、准备原表

##建表
hive (default)> CREATE TABLE u_data (
              > userid INT,
              > movieid INT,
              > rating INT,
              > unixtime STRING)
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘
              > STORED AS TEXTFILE;
OK
Time taken: 0.073 seconds

##导入数据
hive (default)> LOAD DATA LOCAL INPATH ‘/opt/datas/ml-100k/u.data‘ OVERWRITE INTO TABLE u_data;

3、用python脚本处理数据

##vim weekday_mapper.py
import sys
import datetime

for line in sys.stdin:
  line = line.strip()
  userid, movieid, rating, unixtime = line.split(‘\t‘)
  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
  print ‘\t‘.join([userid, movieid, rating, str(weekday)])

##创建新表
hive (default)> CREATE TABLE u_data_new (
              >   userid INT,
              >   movieid INT,
              >   rating INT,
              >   weekday INT)
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘;
OK
Time taken: 0.027 seconds

##添加脚本
hive (default)> add FILE /opt/datas/ml-100k/weekday_mapper.py;
Added resource: /opt/datas/ml-100k/weekday_mapper.py

##插入数据
hive (default)> INSERT OVERWRITE TABLE u_data_new
              > SELECT
              >   TRANSFORM (userid, movieid, rating, unixtime)        #input from source table,要处理的数据来源于原表
              >   USING ‘python weekday_mapper.py‘            #用的python脚本
              >   AS (userid, movieid, rating, weekday)            #python脚本处理后的输出数据
              > FROM u_data;

##select
hive (default)> SELECT weekday, COUNT(*) FROM u_data_new GROUP BY weekday;

原文地址:https://www.cnblogs.com/weiyiming007/p/10815182.html

时间: 2024-08-02 02:28:37

3.15-3.21 hive项目实战的相关文章

Hive项目实战:用Hive分析“余额宝”躺着赚大钱背后的逻辑

一.项目背景 前两年,支付宝推出的“余额宝”赚尽无数人的眼球,同时也吸引的大量的小额资金进入.“余额宝”把用户的散钱利息提高到了年化收益率4.0%左右,比起银行活期存储存款0.3%左右高出太多了,也正在撼动着银行躺着赚钱的地位. 在金融市场,如果想获得年化收益率4%-5%左右也并非难事,通过“逆回购”一样可以.一旦遇到货币紧张时(银行缺钱),更可达到50%一天隔夜回够利率.我们就可以美美地在家里数钱了!! 所谓逆回购:通俗来讲,就是你(A)把钱借给别人(B),到期时,B按照约定利息,还给你(A)

15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat

15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化大型分布 式项目实战视频教程

2017-08-09 * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.

基于Hadoop离线大数据分析平台项目实战

基于Hadoop离线大数据分析平台项目实战  课程学习入口:http://www.xuetuwuyou.com/course/184 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介: 某购物电商网站数据分析平台,分为收集数据.数据分析和数据展示三大层面.其中数据分析主要依据大数据Hadoop生态系统常用组件进行处理,此项目真实的展现了大数据在企业中实际应用. 课程内容 (1)文件收集框架 Flume ①Flume 设计架构.原理(三大组件) ②Flume 初步使

Spark大型项目实战:电商用户行为分析大数据平台

本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中的PM(产品经理).数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务.最终达到用大数据技术来帮助提升公司的业绩.营业额以及市场占有率的目标. 1.课程研发环境 开发工具: Eclipse Linux:CentOS 6

【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfWork 工作单元,对于这个的解释和实例,网上很多很多大神之作,我在这就不班门弄斧了,只是浅谈 一下个人理解,不一定对,希望大家指正: UnitOfWork 看了很多,个人理解就是 统一事务,在很多操作中我们可能是进行多项操作的,比如 同时保存两个表的数据,如果我们先保存一个表(SaveChanges

iOS开发——使用技术OC篇&项目实战总结之开发技巧

项目实战总结之开发技巧 本文收集了25个关于可以提升程序性能的提示和技巧 1.使用ARC进行内存管理 2.在适当的情况下使用reuseIdentifier 3.尽可能将View设置为不透明(Opaque) 4.避免臃肿的XIBs 5.不要阻塞主线程 6.让图片的大小跟UIImageView一样 7.选择正确的集合 8.使用GZIP压缩 9.重用和延迟加载View 10.缓存.缓存.缓存 11.考虑绘制 12.处理内存警告 13.重用花销很大的对象 14.使用Sprite Sheets 15.避免

【无私分享:ASP.NET CORE 项目实战(第八章)】读取配置文件(二) 读取自定义配置文件

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 我们在 读取配置文件(一) appsettings.json 中介绍了,如何读取appsettings.json. 但随之产生了问题:我们使用的是在 Startup.cs 中(如下图)来实现配置读取,有两个问题 ① 我们如果定义N种配置,是否要再这里添加N条这样的配置 : ② 如果我们的配置不想写在appsettings.json中呢 解决问题 带着上面的两个问题,我们首先来添加一个配置文件 siteconfig.json

iOS开发——完整项目实战OC篇&百思不得姐第四天

iOS开发——完整项目实战OC篇&百思不得姐第四天 上午 一:自定义按钮使用九宫格布局 二:控件不能点击 三:获取用户点击了那个按钮 四:调整按钮内部控件的位置:主流->上下 五:不能直接使用self.navigationController中或者View中获取导航控制器 方法一: 方法二: 六:布局取整 1 // 总行数 2 3 // NSUInteger rows = sqaures.count / maxCols; 4 5 // if (sqaures.count % maxCols)