用hive或mr清洗app数据
1.项目背景
从大量源数据中清洗出有效数据供后续程序使用。
源数据参照log.txt文件
2.项目源数据说明
9841EF7BDBDF0AC9AF42AEBB4E4F8D4F |
Id |
12 |
状态1 |
22 |
状态2 |
33 |
状态3 |
2013/1/1 23:13:58 |
时间 |
您申请的验证码为541714,有效期10分钟。 <酷狗音乐> |
内容 |
3.项目要求结果
2966127347B2BCD1476B156C377A1969 |
Id |
2013/1/1 |
时间列只要日期,清洗掉时分秒 |
<酷狗音乐>-<酷狗音乐>-[爱聊] |
内容列只要{} [] <> 三种符号之间的内容,并且使用-号连接 |
4. 实现要求
(1).筛出id列、时间列、内容列。以逗号分隔,内容列只要[] {} <> 符号包含的内容,并且以-符号连接
(2).技术要求:mr或者hive实现
源数据:
9841EF7BDBDF0AC9AF42AEBB4E4F8D4F 12 22 33 2013/1/1 23:13:58 您申请的验证码为541714,有效期10分钟。 <酷狗音乐>
03A68484029444218F09098FE159BA1A 12 22 33 2013/1/1 21:10:20 "您的<'天山影城2..>嘀嗒券尾号7539于19时45分消费。客服4000001666。回复“分值#评论”赢积分,分值5最高1最低"
F5AA9052A6D929E8633FC93258794D0F 12 22 33 2013/1/1 23:13:57 恭喜您,爱聊注册成功!还差一步,您就能免费打电话发短信了。请打开 http://m.iicall.com 下载安装软件。[爱聊]
CEE90A5728A3D91E99A16F2D28B5F24F 12 22 33 2013/1/1 23:11:42 尊敬的用户,您本次注册的短信验证码为381663,请及时输入验证码完成注册。<迅雷网络>
93AE376541CC3AD3EC530F7A6872B419 12 22 33 2013/1/1 23:11:41 嘀嗒团:您团购的“子金皇朝酒店1日房”券号570575199105,有效期至1月31日。商家电话地址参考网页
7EBB573A658505AF55C955D860B60DC6 12 22 33 2013/1/1 22:18:06 "亲爱的给惠网会员,恭祝您元旦快乐!合家安康!幸福连连!返利多多!淘宝实时查单,百万年终奖免费送见站内信 geihui.com<给惠网>"
9841EF7BDBDF0AC9AF42AEBB4E5F8D4F 12 22 33 2013/1/1 23:13:58 您申请的验证码为541714,有效期10分钟。 <酷狗音乐>
03A68484029444218F09096FE159BA1A 12 22 33 2013/1/1 21:10:20 "您的<'天山影城2..>嘀嗒券尾号7539于19时45分消费。客服4000001666。回复“分值#评论”赢积分,分值5最高1最低"
F5AA9052A6D929E8633FC98258794D0F 12 22 33 2013/1/1 23:13:57 恭喜您,爱聊注册成功!还差一步,您就能免费打电话发短信了。请打开 http://m.iicall.com 下载安装软件。[爱聊]
CEE90A5728A3D91E99A16F2D28B5F24F 12 22 33 2013/1/1 23:11:42 尊敬的用户,您本次注册的短信验证码为381663,请及时输入验证码完成注册。<迅雷网络>
93AE376541CC3AD3EC53997A6872B419 12 22 33 2013/1/1 23:11:41 嘀嗒团:您团购的“子金皇朝酒店1日房”券号570575199105,有效期至1月31日。商家电话地址参考网页
7EBB573A658505AF55C955D860B60DC6 12 22 33 2013/1/1 22:18:06 "亲爱的给惠网会员,恭祝您元旦快乐!合家安康!幸福连连!返利多多!淘宝实时查单,百万年终奖免费送见站内信 geihui.com<给惠网>"
9841EF7BDBDF0AC9AF42AEBB4E4F8D4F 12 22 33 2013/1/1 23:13:58 您申请的验证码为541714,有效期10分钟。 <酷狗音乐>
03A68484029444218F88098FE159BA1A 12 22 33 2013/1/1 21:10:20 "您的<'天山影城2..>嘀嗒券尾号7539于19时45分消费。客服4000001666。回复“分值#评论”赢积分,分值5最高1最低"
9841EF7BDBDF0AC9AF42AEBB4E4F8D4F 12 22 33 2013/1/1 23:13:57 恭喜您,爱聊注册成功!还差一步,您就能免费打电话发短信了。请打开 http://m.iicall.com 下载安装软件。[爱聊]
CEE90A5728A3D91E66A16F2D28B5F24F 12 22 33 2013/1/1 23:11:42 尊敬的用户,您本次注册的短信验证码为381663,请及时输入验证码完成注册。<迅雷网络>
93AE376541CC7773EC530F7A6872B419 12 22 33 2013/1/1 23:11:41 嘀嗒团:您团购的“子金皇朝酒店1日房”券号570575199105,有效期至1月31日。商家电话地址参考网页
7EBB573A657775AF55C955D860B60DC6 12 22 33 2013/1/1 22:18:06 "亲爱的给惠网会员,恭祝您元旦快乐!合家安康!幸福连连!返利多多!淘宝实时查单,百万年终奖免费送见站内信 geihui.com<给惠网>"
9841EF7BDBDF0A77AF42AEBB4E4F8D4F 12 22 33 2013/1/1 23:13:58 您申请的验证码为541714,有效期10分钟。 <酷狗音乐>
03A68484026666218F09098FE159BA1A 12 22 33 2013/1/1 21:10:20 "您的<'天山影城2..>嘀嗒券尾号7539于19时45分消费。客服4000001666。回复“分值#评论”赢积分,分值5最高1最低"
F5AA9052A6D966E8633FC93258794D0F 12 22 33 2013/1/1 23:13:57 恭喜您,爱聊注册成功!还差一步,您就能免费打电话发短信了。请打开 http://m.iicall.com 下载安装软件。[爱聊]
CEE90A5728A7771E99A16F2D28B5F24F 12 22 33 2013/1/1 23:11:42 尊敬的用户,您本次注册的短信验证码为381663,请及时输入验证码完成注册。<迅雷网络>
93AE376541CC3AD3EC537F7A6872B419 12 22 33 2013/1/1 23:11:41 嘀嗒团:您团购的“子金皇朝酒店1日房”券号570575199105,有效期至1月31日。商家电话地址参考网页
7EBB573A658505AF556655D860B60DC6 12 22 33 2013/1/1 22:18:06 "亲爱的给惠网会员,恭祝您元旦快乐!合家安康!幸福连连!返利多多!淘宝实时查单,百万年终奖免费送见站内信 geihui.com<给惠网>"
9841EF7BDBDF0AC9AF55AEBB4E4F8D4F 12 22 33 2013/1/1 23:13:58 您申请的验证码为541714,有效期10分钟。 <酷狗音乐>
03A68484029444555F09098FE159BA1A 12 22 33 2013/1/1 21:10:20 "您的<'天山影城2..>嘀嗒券尾号7539于19时45分消费。客服4000001666。回复“分值#评论”赢积分,分值5最高1最低"
F5AA9052A6D92555633FC93258794D0F 12 22 33 2013/1/1 23:13:57 恭喜您,爱聊注册成功!还差一步,您就能免费打电话发短信了。请打开 http://m.iicall.com 下载安装软件。[爱聊]
CEE90A5555A3D91E99A16F2D28B5F24F 12 22 33 2013/1/1 23:11:42 尊敬的用户,您本次注册的短信验证码为381663,请及时输入验证码完成注册。<迅雷网络>
93AE376545553AD3EC530F7A6872B419 12 22 33 2013/1/1 23:11:41 嘀嗒团:您团购的“子金皇朝酒店1日房”券号570575199105,有效期至1月31日。商家电话地址参考网页
7EBB573A658505AF55C955D550B60DC6 12 22 33 2013/1/1 22:18:06 "亲爱的给惠网会员,恭祝您元旦快乐!合家安康!幸福连连!返利多多!淘宝实时查单,百万年终奖免费送见站内信 geihui.com<给惠网>"
实现方法:
hive方法:
实现要求
(1).筛出id列(第一列)、时间列(第五列)、内容列(第六列)。以逗号分隔,内容列只要[] {} <> 符号包含的内容,并且以-符号连接
思路:
用hive内置函数:
创建一个字段的表
数据上传到hdfs
hadoop fs -mkdir /source
hadoop fs -put ./log.txt /source
创建外部表
CREATE DATABASE IF NOT EXISTS kugou;
CREATE EXTERNAL TABLE IF NOT EXISTS data(
log String
)
location '/source';
set hive.cli.print.current.db=true;
加载数据
load data inpath '/source/log.txt' into table data;
(1)
第一列数据:筛出id列
split(log,"\t")[0]拆分\t得到第一个字段
select split(log,"\t")[0] from data;
第五列数据:时间列
select split(log,"\t")[4] from data;
第六列数据:内容列
select split(log,"\t")[5] from data;
用逗号分隔;concat
select concat(split(log,"\t")[0],',',split(log,"\t")[4],',',split(log,"\t")[5]) from data;
2013/1/1 时间列只要日期,清洗掉时分秒:
时间列(第五列),以空格拆分,只要第一个字段:
select split(split(log,"\t")[4],' ')[0] from data;
<酷狗音乐>-<酷狗音乐>-[爱聊] 内容列只要{} [] <> 三种符号之间的内容,并且使用-号连接:
思路7:正确
select regexp_extract(split(log,"\t")[5],'(<.*>|\\[.*\\])',1) from data;
合并:以逗号连接
select concat(split(log,"\t")[0],',',split(log,"\t")[4],',',regexp_extract(split(log,"\t")[5],'(<.*>|\\[.*])',1)) from data;
mr方法:
1.
package cn.bcqm1711.mr.sixText.a.m5_31;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
* Created by duqixiang on 2018/5/12.
*/
public class sixTextDemo extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "sixTextDemo");
job.setJarByClass(sixTextDemo.class);
//mapTask
job.setMapperClass(sixTextMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path("D:\\javaPractice\\work\\log.txt"));
job.setReducerClass(sixTextReducr.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileOutputFormat.setOutputPath(job, new Path("D:\\javaPractice\\out\\out06"));
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String[] args) throws Exception {
System.exit(ToolRunner.run(new sixTextDemo(), args));
}
}
2.
package cn.bcqm1711.mr.sixText.a.m5_31;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.jruby.RubyProcess;
import java.io.IOException;
/**
* Created by duqixiang on 2018/5/12.
*/
public class sixTextMapper extends Mapper<LongWritable, Text, Text,Text >{ //输入的数据类型必须是LongWritable
int i = 0;
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//切开数据
String lines = value.toString();
String[] result = lines.split("\t");
String str1 = result[0]; //第1列
String str2 = result[4].split(" ")[0];//第5列,并以空格拆分
String str3 = result[5];//第6列。
String str4 = null; //
if(str3.contains("<")){
str3 = result[5].substring(result[5].indexOf('<'),result[5].indexOf('>')); //substring(起始,最后),不包含最后的字段
str4 = str2 + "," + str3 + ">";
}else if(str3.contains("[")){
str3 = result[5].substring(result[5].indexOf('['),result[5].indexOf(']'));
str4 = str2 + "," + str3 + "]";
}else{
str3 = null;
str4 = str2;
}
System.out.print(str1);
System.out.println(str4);
context.write(new Text(str1),new Text(str4));//以第一列为key,以拼接后的字符串为value
}
}
3.
package cn.bcqm1711.mr.sixText.a.m5_31;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* Created by duqixiang on 2018/5/12.
*/
public class sixTextReducr extends Reducer<Text,Text,Text,Text> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String str2 = null;
String str1 = null;
String str = null;
for (Text n : values) {
String lines = n.toString();
if(lines.contains(",")){ //判断是否有",",是因为部分第六列没有要拼接的内容
String[] result = lines.split(",");//切分成数组
if(str1==null){
str1 =result[1]; //result[1]为最后一列的内容
}else{
str1 = str1 + "-" + result[1];
}
str2 = result[0];
}else{
str2 = lines;
}
}
str = str2 + "\t" + str1;
context.write(key, new Text(str)); //以第一列为key,以拼接后的字符串为value
}
}
自定义UDF函数:
hadoop fs -mkdir /mylog
hadoop fs -put /home/zhaojian/log.txt /mylog
hadoop fs -cat /mylog/log.txt
CREATE external TABLE IF NOT EXISTS log(
id string,
statu1 string,
statu2 string,
statu3 string,
time string,
info string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
stored as textfile
location '/mylog';
//自定义函数.继承UDF.!
add jar /home/zhaojian/myideawork.jar; //添加jar包
CREATE TEMPORARY FUNCTION cons AS 'com.qingmang.udf.MySplit';//创建方法
select concat_ws(",",id,substr(time,0,8),cons(info,"[{<\\[](.*)?[}>\\]]")) from log;//
select concat_ws(",",id,max(substr(time,0,8)),concat_ws("-",collect_list(cons(info,"[{<\\[](.*)?[}>\\]]")))) from log group by id;
//select concat_ws(",",id,max(substr(time,0,8)),collect_set(cons(info,"[{<\\[](.*)?[}>\\]]"))) from log group by id;
collect_set(col) group by 分组之后把同组中的某个字段 放到一个集合,输出,去重
select cons("67677<迅雷网络>asd{rew}21ee[ewd]qwewqe[3213213]567657","[{<\\[](.*?)[}>\\]]");
自定义函数:
package com.qingmang.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MySplit extends UDF {
public String evaluate(String info,String regex){
//把规则编译成模式对象
Pattern p =Pattern.compile(regex);
//通过模式对象得到匹配器对象,存放被匹配的字符串
Matcher m = p.matcher(info);
//这个判断的顺序是从前向后执行,每得到一个正确结果就会停止,判断,等待下次命令再继续执行。
//使用循环
String tot="";
//调用匹配器对象的功能
//通过find方法就是查找有没有满足条件的子串
while(m.find()){
tot += "-"+m.group();
}
if(tot.equals("")) {
return "null";
}else{
return tot.substring(1,tot.length());//索引为0时,字段为"-"
}
//这个破玩意弄了半天!!! 构建路径 后 上传./!! 修改完之后一定要把 新的 传递到 linux 上!! 用新的构建路径!!!
//抛出的各种异常 就会执行不下去!! 所以要在方法里 处理各种可能的情况!!!
}
}
用hive或mr清洗app数据的更多相关文章
- hdfs数据到hive中,以及hdfs数据隐身理解
hdfs数据到hive中: 假设hdfs中已存在好了数据,路径是hdfs:/localhost:9000/user/user_w/hive_g2park/user_center_enterprise_ ...
- Hive on MR调优
当HiveQL跑不出来时,基本上是数据倾斜了,比如出现count(distinct),groupby,join等情况,理解 MR 底层原理,同时结合实际的业务,数据的类型,分布,质量状况等来实际的考虑 ...
- Android使用代码消除App数据并重新启动设备
/** * 使用代码消除App数据 * 我们不寻常的清除App数据,中找到相应的App * 然后选择其清除数据.以下给出代码实现. * * 注意事项: * 1 设备须要root * 2 该演示样例中删 ...
- [数据清洗]-使用 Pandas 清洗“脏”数据
概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...
- [数据清洗]- Pandas 清洗“脏”数据(二)
概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...
- [数据清洗]- Pandas 清洗“脏”数据(三)
预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...
- Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分
1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神 ...
- APP数据的爬取
前言 App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,而且数据大多是以 JSON形式传 输的,解析更加简单.在 Web 端,我们可以通过浏览器的开发者工具监听到各个网络请求和响应过程 ...
- Python爬虫入门教程 29-100 手机APP数据抓取 pyspider
1. 手机APP数据----写在前面 继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程 ...
- 用Sqoop进行Hive和MySQL之间的数据互导
Hive导数据入MySQL 创建mysql表 use anticheat; create table anticheat_blacklist( userid varchar(30) primary k ...
随机推荐
- 后宫酒店HaremHotel游戏Python游戏作弊方法游戏金币增加方法
额,这个游戏嘛,内容就不说了, 顺便送给大家下载地址:https://store.zhaimaojun.cn/GameDetail/280 这个游戏刚开始起步其实比较困难,因为没钱啊,动不动就要花钱, ...
- docker / compose 的安装 和 体验
文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...
- Maven - cmd命令行窗口创建maven项目
一.构建命令 mvn archetype:generate 当出现以上的命令提示,直接回车下一步即可: 二.输入maven项目的groupId.artifactId.version 三.maven项目 ...
- 09. C语言内嵌汇编代码
C语言函数内可以自定义一段汇编代码,在GCC编译器中使用 asm 或 __asm__ 关键词定义一段汇编代码,并可选添加volatile关键字,表示不要让编译器优化这段汇编代码. 内嵌汇编代码格式如下 ...
- Istio(七):ServiceEntry,sidecar,Envoy Filter
目录 一.模块概览 二.系统环境 三.ServiceEntry 四.sidecar 4.1 Sidecar 4.2 工作负载选择器 4.3 入口和出口监听器 五.Envoy Filter 5.1 En ...
- WordPress网站被黑怎么办?【含解决方案】
在我们的日常WordPress主题售后工作中,经常会有用户反馈网站出现问题,例如:阿里云提示后门木马文件:打开后跳转到其他地址:页面出现乱码:被添加了其他内容等,根据我们的经验,这种一般都是网站被黑导 ...
- 使用tc命令模拟linux网络延迟环境
tc(Traffic Control)是 Linux 中用于流量控制和网络模拟的强大工具.你可以使用它来模拟网络延迟.带宽限制.数据包丢失等. 以下是一个使用 tc 模拟网络延迟的基本步骤: 1.查看 ...
- GeneralUpdate .Net5 WPF、Winfrom、控制台应用自动更新组件
https://www.bilibili.com/video/BV1aX4y137dd/?vd_source=43d3e66cc2ad46bac54dfb0c6a3a0a23 GeneralUpdat ...
- switch case 跳转表
一.事情来源 事情来源是一段奇怪的代码,代码如下 int x = 1000; switch (x) { case 1000: { NSLog(@"%d", 1); } case 2 ...
- itest work 开源接口测试&敏捷测试管理平台 9.5.0 GA_u3,优化及修复关键 BUG
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...