第1关:数据清洗MapReduce综合应用案例 — 招聘数据清洗

该博客主要介绍了如何对包含大数据工程师职位信息的数据进行清洗,包括处理薪资、转换城市编码为城市名称,并将清洗后的数据存储到HBase数据库中。涉及的工具有MySQL、HBase和Java相关库,如阿里巴巴的FastJSON和Hadoop的MapReduce。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据提示,在右侧编辑器补充代码,对数据按照一定规则进行清洗。

数据说明如下:data.json

数据所在位置:/root/data/data.json

{
    "id":4,
    "company_name":"智联招聘网/Zhaopin.com",
    "eduLevel_name":"本科",
    "emplType":"全职",
    "jobName":"大数据工程师010",
    "salary":"20K-30K",
    "createDate":"2019-04-21T12:14:27.000+08:00",
    "endDate":"2019-05-21T12:14:27.000+08:00",
    "city_code":"530",
    "companySize":"1000-9999人",
    "welfare":"",
    "responsibility":"岗位职责:1、负责体系大数据分析的ETL的代码开发及优化;2、...",
    "place":"北京市朝阳区望京阜荣街10号首开广场5层",
    "workingExp":"1-3年"
}
id company_name eduLevel_name emplType jobName salary createDate endDate city_code companySize welfare responsibility place workingExp
id编号 公司名称 学历要求 工作类型 工作名称 薪资 发布时间 截止时间 城市编码 公司规模 福利 岗位职责 地区 工作经验

Mysql数据库:

用户名:root; 密码:123123

数据库名:mydb

城市编码表:province

列名 类型 非空 是否自增 介绍
city_code varchar(255) 城市编码
city_name varchar(255) 城市名称

HBase数据库:

最终结果表:job 列族:info

清洗规则:

  • 若某个属性为空则删除这条数据;

  • 处理数据中的salary

    1)mK-nK:(m+n)/2; 2)其余即为0

  • 按照MySQLprovince 将城市编码转化为城市名;

  • 将结果存入HBasejob中;

    </
### MapReduce在电商数据清洗中的综合应用 #### 背景介绍 电子商务平台每天都会产生大量的交易日志和其他形式的数据。这些原始数据通常存在噪声、不一致性和缺失值等问题,因此需要进行有效的数据清洗才能用于后续的分析工作。 #### 数据清洗需求概述 对于电商平台而言,在处理访问日志时不仅注基本的日志记录本身,还需要从中提取更多有价值的信息以便于更深入地了解用户行为模式以及优化业务流程。具体来说: - 需要解析 IP 地址获取地理位置信息(如省份和城市),从而支持按地区统计 UV 和 PV 的需求[^2]。 - 解析 HTTP 请求字符串得到请求方法 (GET/POST),URL 及协议版本等细节,有助于理解页面浏览习惯并识别潜在的安全威胁。 - 提取 User-Agent 字段的内容以推断访客所使用的设备类型及其操作系统版本,进而评估不同终端上的用户体验差异。 #### 使用MapReduce实现数据清洗过程 ##### 输入文件结构假设 假定输入是一个由多个字段组成的文本文件,每条记录代表一次HTTP请求事件,并且各部分之间用分号隔开。例如: `appid;ip;request;status;httpReferer;userAgent` ##### Mapper阶段的任务描述 Mapper负责读入键值对(key, value)作为其输入,其中 key 是偏移量而 value 则对应着一行完整的日志内容。在此基础上完成如下操作: 1. 将整行分割成各个组成部分; 2. 对特定组件进一步细化加工——比如调用第三方 API 或者内置函数库来进行地理定位转换(IP -> Province/City), URL 参数解析(Request->Method,Request_URL,Http_Version); 3. 构建新的 Key-Value 形式的中间结果集供 Reducer 处理。 以下是Python伪代码表示法展示如何编写 mapper 函数: ```python import re from geoip import geolite2 # 假设已安装相应模块 def map(line): fields = line.strip().split(';') try: app_id = fields[0] ip_address = fields[1] match = geolite2.lookup(ip_address) if not match is None: location_info = {'province':match.subdivisions[-1].name,'city':match.city} request_details = parse_request(fields[2]) yield ( f"{app_id};{ip_address}", { 'province':location_info['province'], 'city':location_info['city'], **request_details, 'status_code':fields[3], 'referer':fields[4], 'ua_string':fields[5] } ) except Exception as e: pass def parse_request(request_str): pattern = r'^(?P<method>\w+)\s+(?P<path>[^\s]+)\s+HTTP/(?P<version>[\d\.]+)$' m = re.match(pattern,request_str) return {} if m==None else {k:v for k,v in m.groupdict().items()} ``` ##### Reducer阶段的任务说明 Reducer接收来自同一应用程序ID下所有映射器产生的输出项,并对其进行聚合汇总形成最终的结果集合。在这个例子中主要是去除重复记录并将相同条件下的统计数据累加起来。 下面是简化版 reducer 实现方式之一: ```python current_key = None agg_data = {} for key,value_dict in sorted(intermediate_output): if current_key !=key : if agg_data!={}: output(current_key,agg_data) current_key=key agg_data=dict.fromkeys(['uv','pv'],set()) uv_set=agg_data.get('uv',set())|{value_dict["userId"]} pv_count=len(uv_set)+len(agg_data.get('pv',[])) agg_data.update({ "uv":list(uv_set), "pv":[*range(pv_count)] }) if agg_data!= {}:output(current_key ,agg_data) def output(key,data): print(f'{key}\t{" ; ".join([str(len(data[k]))+" "+k.upper() for k in ["uv","pv"]])}') ``` 此段脚本实现了基于唯一标识符 `userId` 计算独立访客数量(UV)的功能,同时也计算了页面查看次数(PV)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值