概述
mapreduce清洗json案例
目标:去重去空,清洗不符合规则的数据以及数据格式转换(num-numk·num薪转换成numk·12薪,数据只取第一个num-保留小数点后两位,如20-30k·18薪就转换成了37.50)
#编写map
public class LiePingMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
private static Text text =new Text();
private static String
regex="^(\d*?)-(\d*?)k·(\d*?)薪$";
private static Pattern pattern=Pattern.compile(regex);
private
static DecimalFormat decimalFormat=new DecimalFormat("#.00");
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line =value.toString();
line=line.trim().startsWith("[")||line.trim().startsWith(",") ?
line.substring(1,line.length()):line;
//清除不符合要求的数据
if(!line.startsWith("{")||!line.endsWith("}")||line.startsWith("["))
return;
//解析json数据
JSONObject jsonObject=JSONObject.parseObject(line);
//id 招聘标题 公司名字 所需学历 所需经验 所需语言 所需年龄 所需技能详情 工作地点 薪资
String[] data=new String[10];
data[0]=jsonObject.getString("job_id");
data[1]=jsonObject.getString("job_title");
data[2]=jsonObject.getString("job_company");
data[3]=jsonObject.getString("job_requir_degree");
data[4]=jsonObject.getString("job_requir_experience");
data[5]=jsonObject.getString("job_requir_language");
data[6]=jsonObject.getString("job_requir_age");
data[7]=jsonObject.getString("job_requir");
data[8]=jsonObject.getString("job_address");
data[9]=jsonObject.getString("job_salary");
//去空
Arrays.asList(data).forEach(item-> {
if(item==null||item.equals("")) return;
}
);
//将薪资格式不符合要求的洗掉并格式化
Matcher matcher=pattern.matcher(data[9]);
if(matcher.find()){
data[9]=decimalFormat.format((Double.parseDouble(matcher.group(1))+Double.parseDouble(matcher.group(2)))/2*(Double.parseDouble(matcher.group(3)))/12);
}else{
return;
}
//分割数据
String res="";
for(String item:data){
res=res+item+"|";
}
//去掉最后一个"|"
text.set(res.substring(0,res.length()-1));
context.write(text,NullWritable.get());
}
}
#编写reduce(去重)
public class LiePingReducer
extends Reducer<Text, NullWritable, Text, NullWritable> {
public
void reduce(Text key, Iterable<NullWritable> value, Context context) throws IOException, InterruptedException {
context.write(key, NullWritable.get());
}
}
#编写driver
public class LiePingDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 1 获取配置信息以及封装任务
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
// 2 设置jar加载路径
job.setJarByClass(LiePingDriver.class);
// 3 设置map和reduce类
job.setMapperClass(LiePingMapper.class);
job.setReducerClass(LiePingReducer.class);
// 4 设置map输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
// 5 设置最终输出kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
// 6 设置输入和输出路径
FileInputFormat.setInputPaths(job, new Path("hdfs://hadoop101:9000/LiePing/"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop101:9000/LiePing/Clear"));
// 7 提交
boolean result = job.waitForCompletion(true);
System.exit(result ? 0 : 1);
}
}
清洗前
[{"job_id": "%7B%22job_id%22%3A28220889%2C%22job_kind%22%3A%222%22%7D", "job_title": "资深大数据开发工程师(J10330)", "job_company": "明略科技集团", "job_requir_degree": "统招本科", "job_requir_experience": "5-10年", "job_requir_language": "语言不限", "job_requir_age": "年龄不限", "job_requir": ["工作职责:", "1. 负责公司大数据存储相关产品的架构设计和系统调优;", "2. 完善和优化现有存储系统,编写核心系统代码;", "3. 善于发现系统的性能瓶颈、设计缺陷,提出改进方案并实施;", "4. 对现有系统进行宏观的思考,规划形成统一的框架、平台或组件;", "5. 能够与产品经理、管理团队进行良好的沟通合作,按时保质保量完成开发任务。", "任职资格:", "1. 统招计算机科学或相关技术学科的学士、硕士学位(或同等学历);", "2. Java相关开发经验3年以上,大数据开发经验3年以上,熟悉并理解缓存、消息、RPC调用框架、jvm 调优、序列化、nio等原理,对各种开源框架如Spring、dubbo等有深入了解,读过源代码、自己写过框架优先;", "3. 精通分布式数据处理底层技术,包括但不限于:hbase/elasticsearch/impala/kylin/doris等,懂druid.io佳;", "4. 具有强烈的责任心,良好的沟通、学习能力,良好的团队合作意识,勇于接受技术挑战;", "5. 熟悉go/c/c++语言优先;", "6. (GitHub上)有自己开源项目优先;", "7. 性格活泼,对技术充满热情。rn
"], "job_address": "北京-望京", "job_salary": "25-35k·15薪"}
,{"job_id": "%7B%22job_id%22%3A31969307%2C%22job_kind%22%3A%222%22%7D", "job_title": "大数据开发-报表", "job_company": "宇信易诚", "job_requir_degree": "本科及以上", "job_requir_experience": "5-10年", "job_requir_language": "语言不限", "job_requir_age": "年龄不限", "job_requir": ["1.熟悉大数据生态圈相关组件,比如hadoop,hive,impala等", "2.熟悉shell、python等脚本语言以及linux常用指令等", "3.扎实的sql基础,不限于spark-sql,hive-sql", "4.了解数仓分层架构体系和建模", "5.有管理驾驶和报表开发经验,使用过帆软优先", "6.有数据集市建设经验优先", "7.优秀的业务理解和需求分析能力,能较好的与业务沟通,有金融业务经验优先rn
"], "job_address": "北京-朝阳区", "job_salary": "16-25k·13薪"}
,{"job_id": "%7B%22job_id%22%3A31970399%2C%22job_kind%22%3A%222%22%7D", "job_title": "2021届校招-数据处理工程师(环保、医疗、大数据)", "job_company": "中兴网信", "job_requir_degree": "统招本科", "job_requir_experience": "经验不限", "job_requir_language": "语言不限", "job_requir_age": "年龄不限", "job_requir": ["工作职责:", "1)负责大数据、环保、医疗产品的安装、调试及数据采集、对接等工作;", "2)了解用户定制化需求,协助研发团队进行开发、实现;", "3)梳理用户业务流程,建立业务数据体系,对相关数据提取、处理、分析和编制报告;", "4)集成管理第三方软件实施。", "任职资格:", "1、学历要求:2021应届生本科生及以上;", "2、计算机、软件工程、信息管理等相关专业,全日制本科及以上学位,毕业证学位证四级证齐全;", "3、具备良好的沟通能力,文档编写能力。", "4、熟悉主流数据库技术,如 oracle、mySql等;熟练使用PL/SQL Developer,会写存储过程;", "5、熟悉Hadoop/Spark生态系统组件的使用,参与数据源分析,有大数据平台与各业务系统的数据对接、实现数据仓库的数据汇聚、清洗和抽取等工作经验优先。rn
"], "job_address": "深圳", "job_salary": "8-12k·12薪"}
]
清洗后
%7B%22job_id%22%3A28220889%2C%22job_kind%22%3A%222%22%7D|资深大数据开发工程师(J10330)|明略科技集团|统招本科|5-10年|语言不限|年龄不限|["工作职责:","1. 负责公司大数据存储相关产品的架构设计和系统调优;","2. 完善和优化现有存储系统,编写核心系统代码;","3. 善于发现系统的性能瓶颈、设计缺陷,提出改进方案并实施;","4. 对现有系统进行宏观的思考,规划形成统一的框架、平台或组件;","5. 能够与产品经理、管理团队进行良好的沟通合作,按时保质保量完成开发任务。","任职资格:","1. 统招计算机科学或相关技术学科的学士、硕士学位(或同等学历);","2. Java相关开发经验3年以上,大数据开发经验3年以上,熟悉并理解缓存、消息、RPC调用框架、jvm 调优、序列化、nio等原理,对各种开源框架如Spring、dubbo等有深入了解,读过源代码、自己写过框架优先;","3. 精通分布式数据处理底层技术,包括但不限于:hbase/elasticsearch/impala/kylin/doris等,懂druid.io佳;","4. 具有强烈的责任心,良好的沟通、学习能力,良好的团队合作意识,勇于接受技术挑战;","5. 熟悉go/c/c++语言优先;","6. (GitHub上)有自己开源项目优先;","7. 性格活泼,对技术充满热情。rn
"]|北京-望京|37.50
%7B%22job_id%22%3A31969307%2C%22job_kind%22%3A%222%22%7D|大数据开发-报表|宇信易诚|本科及以上|5-10年|语言不限|年龄不限|["1.熟悉大数据生态圈相关组件,比如hadoop,hive,impala等","2.熟悉shell、python等脚本语言以及linux常用指令等","3.扎实的sql基础,不限于spark-sql,hive-sql","4.了解数仓分层架构体系和建模","5.有管理驾驶和报表开发经验,使用过帆软优先","6.有数据集市建设经验优先","7.优秀的业务理解和需求分析能力,能较好的与业务沟通,有金融业务经验优先rn
"]|北京-朝阳区|22.21
%7B%22job_id%22%3A31970399%2C%22job_kind%22%3A%222%22%7D|2021届校招-数据处理工程师(环保、医疗、大数据)|中兴网信|统招本科|经验不限|语言不限|年龄不限|["工作职责:","1)负责大数据、环保、医疗产品的安装、调试及数据采集、对接等工作;","2)了解用户定制化需求,协助研发团队进行开发、实现;","3)梳理用户业务流程,建立业务数据体系,对相关数据提取、处理、分析和编制报告;","4)集成管理第三方软件实施。","任职资格:","1、学历要求:2021应届生本科生及以上;","2、计算机、软件工程、信息管理等相关专业,全日制本科及以上学位,毕业证学位证四级证齐全;","3、具备良好的沟通能力,文档编写能力。","4、熟悉主流数据库技术,如 oracle、mySql等;熟练使用PL/SQL Developer,会写存储过程;","5、熟悉Hadoop/Spark生态系统组件的使用,参与数据源分析,有大数据平台与各业务系统的数据对接、实现数据仓库的数据汇聚、清洗和抽取等工作经验优先。rn
"]|深圳|10.00
清洗后的数据可以导入hive等组件进行数据分析等················································
最后
以上就是高高黄豆为你收集整理的mapreduce清洗实战的全部内容,希望文章能够帮你解决mapreduce清洗实战所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复