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数据的更多相关文章

  1. hdfs数据到hive中,以及hdfs数据隐身理解

    hdfs数据到hive中: 假设hdfs中已存在好了数据,路径是hdfs:/localhost:9000/user/user_w/hive_g2park/user_center_enterprise_ ...

  2. Hive on MR调优

    当HiveQL跑不出来时,基本上是数据倾斜了,比如出现count(distinct),groupby,join等情况,理解 MR 底层原理,同时结合实际的业务,数据的类型,分布,质量状况等来实际的考虑 ...

  3. Android使用代码消除App数据并重新启动设备

    /** * 使用代码消除App数据 * 我们不寻常的清除App数据,中找到相应的App * 然后选择其清除数据.以下给出代码实现. * * 注意事项: * 1 设备须要root * 2 该演示样例中删 ...

  4. [数据清洗]-使用 Pandas 清洗“脏”数据

    概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...

  5. [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...

  6. [数据清洗]- Pandas 清洗“脏”数据(三)

    预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...

  7. Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分

    1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神 ...

  8. APP数据的爬取

    前言 App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,而且数据大多是以 JSON形式传 输的,解析更加简单.在 Web 端,我们可以通过浏览器的开发者工具监听到各个网络请求和响应过程 ...

  9. Python爬虫入门教程 29-100 手机APP数据抓取 pyspider

    1. 手机APP数据----写在前面 继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程 ...

  10. 用Sqoop进行Hive和MySQL之间的数据互导

    Hive导数据入MySQL 创建mysql表 use anticheat; create table anticheat_blacklist( userid varchar(30) primary k ...

随机推荐

  1. 【2023最新B站评论爬虫】用python爬取上千条哔哩哔哩评论

    目录 一.爬取目标 二.展示爬取结果 三.爬虫代码 四.同步视频 五.附完整源码 您好,我是@马哥python说,一枚10年程序猿. 一.爬取目标 之前,我分享过一些B站的爬虫: [Python爬虫案 ...

  2. nmcli device status状态为unmanaged

    遇到报错:(device lo not available because device is strictly unmanaged) nmcli device status 查看设备状态 nmcli ...

  3. fastposter发布1.4.3 跨语言的海报生成器

    fastposter发布1.4.3 跨语言的海报生成器 v1.4.3 增加golang语言支持,优化生成器代码,完善官方文档 昨天喝了点小9️⃣,发版慢了些. future: 增加golang语言支持 ...

  4. 使用 Splashtop 启用员工远程访问

    使员工进行远程工作似乎是一项耗时.不安全且昂贵的任务.但是,借助 Splashtop,您可以快速.轻松.安全地使您的员工从任何位置以最高 价值远程访问其工作站. ​ 如何使用 Splashtop 启用 ...

  5. spring boot 整合mybatis 配置多数据源 数据源切换和多数据源的事务

    因为项目中用到了多数据源 不可避免的会有各种各样的问题列一下最主要的问题: 1 如何配置多数据源???2 spring项目中多数据源无法切换???3 操作了2个或者2个以上数据库的数据无法保证事务的一 ...

  6. quartzui 的界面管理

    基于Quartz.NET3.0的定时任务Web可视化管理.docker打包开箱即用.内置SQLite持久化.语言无关.业务代码零污染.支持 RESTful风格接口.傻瓜式配置 quartzuiquar ...

  7. RBD与Cephfs

    目录 1. RBD 1. RBD特性 2. 创建rbd池并使用 2.1 创建rbd 2.2 创建用户 2.3 下发用户key与ceph.conf 2.4 客户端查看pool 2.5 创建rbd块 2. ...

  8. 微信小程序预约视频号直播

    一.概述 微信小程序提供了可以唤起预约视频号直播弹窗的接口 reserveChannelsLive,该接口接收一个参数 noticeId,通过 getChannelsLiveNoticeInfo 接口 ...

  9. JavaSE 标签 break continue

    *标签.break.continue 当需要结束多个循环后,则使用标签 label:for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ if(j==2) ...

  10. idea 使用 mvn clean package 报错 Could not create local repository at

    使用 mac 版本的 idea 打包使用打包命令 mvn clean package 总是报错: [ERROR] Could not create local repository at /Repos ...