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. 二:大数据架构回顾-Kappa架构

    Kappa 架构是由 LinkedIn 的前首席工程师杰伊·克雷普斯(Jay Kreps)提出的一种架构思想.克雷普斯是几个著名开源项目(包括 Apache Kafka 和 Apache Samza ...

  2. 教你在windows10系统中安装python3(下载安装+配置教程)

    官网地址: https://www.python.org/ 参考文档: https://www.chhui.cn/post-1039.html

  3. Java工具类库大总结

    1. Java自带工具方法 1.1 List集合拼接成以逗号分隔的字符串 // 如何把list集合拼接成以逗号分隔的字符串 a,b,c List<String> list = Arrays ...

  4. fastposter v2.18.0 一分钟完成开发海报-云服务来袭

    fastposter v2.18.0 一分钟完成开发海报-云服务来袭 fastposter 是一款快速开发海报的工具,已经服务众多电商.行业海报.分销系统.电商海报.电商主图等海报生成和制作场景. 什 ...

  5. 策略梯度玩 cartpole 游戏,强化学习代替PID算法控制平衡杆

    cartpole游戏,车上顶着一个自由摆动的杆子,实现杆子的平衡,杆子每次倒向一端车就开始移动让杆子保持动态直立的状态,策略函数使用一个两层的简单神经网络,输入状态有4个,车位置,车速度,杆角度,杆速 ...

  6. C 语言编程 — 高级数据类型 — 字符串

    目录 文章目录 目录 前文列表 字符串 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> <C ...

  7. uniapp 图片懒加载的一种方式

    如果是列表页,可以采用前端分页,通过scroll-view 下拉,在绑定图片地址信息,这样就能下拉部分,加载部分图片了. pageQuery() { let currentPage = this.pQ ...

  8. CSS 溢出文本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. CSS置顶操作(z-index属性)

    z-index使用方法: 1.首先要把position设置为 absolute 或 relative 或 fixed,z-index才能生效 2.设置z-index的值(整数) # 值越大代表越置前, ...

  10. .NET开源、跨平台、使用简单的面部识别库

    前言 今天给大家分享一个.NET开源(MIT License).免费.跨平台(适用于 Windows.MacOS 和 Linux ).使用简单的面部识别库:FaceRecognitionDotNet. ...