0. 说明

  对日志进行降维处理,将日志分为几个小表

  通过编写 UDTF ,对日志降维,将日志聚合体相关字段抽取出来,形成新表。


1. 操作流程

  1.0 日志部分内容

1532868065.518#192.168.23.1#1532868067548#200#{\"appChannel\":\"appstore\",\"appErrorLogs\":

[{\"createdAtMs\":1530455040000,\"errorBrief\":\"at cn.lift.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)\",
\"errorDetail\":\"at cn.lift.dfdfdf.control.CommandUtil.getInfo(CommandUtil.java:67) at sun.reflect.DelegatingMethodAccessorImpl.
invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606)\"},{\"createdAtMs\":1530393180000,
\"errorBrief\":\"at cn.lift.appIn.control.CommandUtil.getInfo(CommandUtil.java:67)\",\"errorDetail\":
\"at cn.lift.dfdfdf.control.CommandUtil.getInfo(CommandUtil.java:67)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)\"}],\"appEventLogs\":[{\"createdAtMs\":1530412800000,\"eventId\":
\"share\",\"logType\":\"event\",\"mark\":\"4\",\"musicID\":\"傲红尘\"}],\"appPageLogs\":[{\"createdAtMs\":1530449520000,
\"logType\":\"page\",\"nextPage\":\"list.html\",\"pageId\":\"list.html\",\"pageViewCntInSession\":0,\"visitIndex\":\"2\"}],
\"appPlatform\":\"ios\",\"appStartupLogs\":[{\"brand\":\"联想\",\"carrier\":\"中国联通\",\"country\":\"china\",\"createdAtMs\":
1530385560000,\"logType\":\"startup\",\"network\":\"cell\",\"province\":\"hebei\",\"screenSize\":\"960 * 640\"},
{\"brand\":\"魅族\",\"carrier\":\"中国铁通\",\"country\":\"america\",\"createdAtMs\":1530412860000,\"logType\":\"startup\",
\"network\":\"3g\",\"province\":\"guangxi\",\"screenSize\":\"480 * 320\"}],\"appUsageLogs\":[{\"createdAtMs\":1530379200000,
\"logType\":\"usage\",\"singleDownloadTraffic\":\"12800\",\"singleUploadTraffic\":\"128\",\"singleUseDurationSecs\":\"123\"}],
\"appVersion\":\"1.0.0\",\"deviceId\":\"Device000099\",\"deviceStyle\":\"oppo 1\",\"osType\":\"1.4.0\"}

  1.1 创建 logAgg表

  创建 logAgg表,分区表 => year, month, day

    create table logAgg(serverTime string,remoteIp string,clientTime string,status string, json string)
partitioned by(year string, month string, day string)
row format delimited
fields terminated by '#' ;

  1.2 load 数据到 logAgg表

  load data local inpath '/home/centos/files/2018-07-01.log' into table logagg partition(year='',month='',day='');

  1.3 降维处理

  1. 代码编写

  ParseJsonUtil.java

  ParseEvent.java

  2. 上传并同步

  先打包再放入 /soft/hive/lib 中

    cp /soft/hive/lib/myhive-1.0-SNAPSHOT.jar /soft/hadoop/share/hadoop/common/lib/
xsync.sh /soft/hadoop/share/hadoop/common/lib/myhive-1.0-SNAPSHOT.jar

  3. 注册临时函数

    create temporary function parseEvent as 'com.share.udtf.ParseEvent';

  4.测试

    select parseEvent(json) from logAgg;

  1.4 创建 logEvent表

    create table logevent(deviceId string, createdAtMs string, eventId string, logType string , mark string, musicID string)
stored as parquet tblproperties('parquet.compression'='GZIP');

  1.5 转储

    insert into logevent
select parseEvent(json) from logagg
where year='' and month='' and day='';

  1.6 对 logEvent表进行操作

  1. 计算每个用户对每首歌的评分

select deviceid, musicid, sum(cast(mark as int)) as sum
from logevent
where musicId is not null
group by deviceid, musicid;

  2. 计算每个用户对每首歌的评分与最高评分

select deviceid , musicid, sum, max(sum)over(partition by deviceid) as sum2
from (
select deviceid, musicid, sum(cast(mark as int)) as sum
from logevent where musicId is not null group by deviceid, musicid
)a;

  3. 使用 sql 计算出,每个用户最喜欢(评分最高)的歌曲,及其评分

select deviceid , musicid, sum from (
select deviceid , musicid, sum, max(sum)over(partition by deviceid) as sum2
from (
select deviceid, musicid, sum(cast(mark as int)) as sum
from logevent where musicId is not null group by deviceid, musicid
)a
)b
where sum=sum2 ;

2. 附加内容

  2.1 Hive 加载 jar 方式

  1. 将 jar 放在 Hive 的 lib 下,并重启 Hive
    /soft/hive/lib

  2. 通过配置文件指定 jar,并重启 Hive
    hive.aux.jars.path=/x/x/x.jar

  3. 临时加载 jar
    hive> add jar /x/x/x.jar

  2.2 注册函数方法

  1. create function as '';    // 永久

  2. create temporary function as '';    // 临时

  3. create function xxx as '' using jar 'hdfs://mycluster/xxx.jar';    // 将 jar 包放入 HDFS 中,避免重启


[Hive_add_11] Hive 使用 UDTF 实现日志降维的更多相关文章

  1. hive自定义UDTF函数叉分函数

    hive自定义UDTF函数叉分函数 1.介绍 从聚合体日志中需要拆解出来各子日志数据,然后单独插入到各日志子表中.通过表生成函数完成这一过程. 2.定义ForkLogUDTF 2.1 HiveUtil ...

  2. Hive分析hadoop进程日志

    想把hadoop的进程日志导入hive表进行分析,遂做了以下的尝试. 关于hadoop进程日志的解析 使用正则表达式获取四个字段,一个是日期时间,一个是日志级别,一个是类,最后一个是详细信息, 然后在 ...

  3. 使用hive分析nginx访问日志方法

    以下案例是使用hive分析nginx的访问日志案例,其中字段分隔通过正则表达式匹配,具体步骤如下: 日志格式: 192.168.5.139 - - [08/Jun/2017:17:09:12 +080 ...

  4. Hive分析统计离线日志信息

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  5. DeveloperGuide Hive UDTF

    Writing UDTF's Writing UDTF's GenericUDTF Interface GenericUDTF Interface A custom UDTF can be creat ...

  6. Hive日志(Hive Logging)--hive GettingStarted翻译

    Hive uses log4j for logging. By default logs are not emitted to the console by the CLI. The default ...

  7. Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》

    一.Hive的简单使用 基本的命令和MySQL的命令差不多 首先在 /opt/datas 下创建数据  students.txt 1001 zhangsan 1002 lisi 1003 wangwu ...

  8. hive 日志

    hive中日志分为两种: 1 系统日志,记录hive运行情况,错误状态 2 job日志 , 记录hive中 job执行的历史过程 系统日志存储位置: 配置在 hive/conf/hive-log4j. ...

  9. Hive 自定义函数 UDF UDAF UDTF

    1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /** * @function 自定义UDF统计最小值 * @author John * */ ...

随机推荐

  1. Tomcat(三):tomcat处理连接的详细过程

    Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html tomcat可以处理静态资源的请求,也可以通过servlet处理动态资源的请求 ...

  2. Oracle 如何开启归档模式

    Oracle开启归档 场景:某所的数据库没有开启归档,如何开启归档模式的文档. 1.查看oracle归档状态 SQL> archive log list; 数据库日志模式 非存档模式 //目前不 ...

  3. javascript小实例,移动端页面中的拖拽

    上文说到,想将移动端的拖拽说一说,那现在趁有时间,就将这个福利文带来了,哈哈! 在我还不知道怎么做移动端的手势操作的时候,我觉得这TM实在是太难了,这是多么高深的学问啊,手势操作耶,上滑下滑左滑右滑的 ...

  4. Docker虚拟机实战

    安装Docker虚拟机 ◆ 先更新yum软件管理器,然后再安装Docker    #更新yum软件管理器    yum -y update    #安装Docker    yum install -y ...

  5. ajax实现跨域访问

    ajax跨域访问是一个老生畅谈的问题啦,网上解决方法很多,discuz用的p3p协议,有兴趣的朋友可以了解下,比较常用的是JSONP方法,貌似目前这种方法只支持GET方式,不如POST方式安全. 即使 ...

  6. Java基础篇——集合浅谈

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10703558.html,否则将追究法律责任!!! Set(基于Map来实现的,不细说) H ...

  7. Java中单例实现

    1:.经典懒汉: 代码如下: package org.pine.test; public class Person { private String name; private int age; pu ...

  8. HTML5标签选择,图文混排使用dl dt dd

    图文混排,可以使用 dl dt dd(dd 和 dt 是同级,不可以嵌套,没有先后顺序) 1,上面红色部分是标题,可以使用h1里面包含一个span标签,样式一样,所以两个可以一起写. 2,上面黑色部分 ...

  9. thinkphp3.2模块名如何不区分大小写?

    thinkphp3.2中已配置:'URL_CASE_INSENSITIVE' => true,对于控制器及操作名大小写都可以,但仍对于模块名的大小写就运行机制出错,比如:http://www.x ...

  10. 快速上手ABP - Angular部分 - 如何最快速度了解相关API。

    不是google,不是angular官网,而是在Visual Studio Code选中这个API对象,鼠标右键,选"Go to Definition" 例子:要想了解FormGr ...