文档章节

数据清洗很要命?那是因为你没看到这份攻略!

openfea
 openfea
发布于 2017/08/10 10:57
字数 1631
阅读 71
收藏 1

对数据挖掘和分析的人员来说,数据清洗和转化是一项非常繁琐和复杂的工作,占用了很大的工作量。

目前,数据的挖掘和分析,基本都是采用pandas,numpy或者R语言,这种处理过程复杂,而且没有一个统一的规范。本文将给大家介绍一项技术,使用FEA-spk技术,可以快速实现数据的清洗和转化工作,而且任何人都能看懂。

FEA-spk技术,它的底层基于最流行的大数据开发框架spark,而且可以和很多流行大数据开发框架结合,比如Hadoop,hbase,mongodb等。使用FEA-spk来做交互分析,不但非常简单易懂,而且几乎和spark的功能一样强大,更重要的一点,它可以实现可视化,处理的数据规模更大,下面就实际的项目为例进行说明。

1. 要想使用FEA-spk技术,首先要创建一个spk的连接,所有的操作都是以它为上下文进行的。

在fea界面运行以下命令:

2. DataFrame的转换

FEA-spk技术操作有2种dataframe,一种是pandas的dataframe,可以直接在fea里面运行dump查看。另外一种是spark的dataframe,它能够进行各种各样的spark算子操作,比如group,agg等

spark dataframe需要转换为pandas的dataframe才能运行dump命令查看,转换的原语如下

pd= @udf df by spk.to_DF  #spark dataframe df转换为pandas dataframe pd

dump pd   #可以直接使用dump命令查看

sdf= @udf spk,pd by spk.to_SDF #将pandas dataframe pd转换为spark dataframe sdf,以便进行spark的各种操作

3. 导入数据源

FEA-spk技术支持各种各样的数据源,hive,mongodb,text,avro , json, csv , parquet,mysql,oracle, postgresql以及具有特定格式的文件

下面举其中几个为例进行说明

(1) 加载csv数据源。

csv数据源分为2种,第一种是带header的(即有字段名的),另外一种是没有header字段名的,格式稍有区别

a.csv文件格式如下

id,hash

1,ssss

2,333

3,5567

下面进行数据加载的命令。

原语如下

df= @udf spk by spk.load_csv with (header,/data/a.csv)

#header为具有字段名的,/data/a.csv为hdfs上的文件路径,如果没有heade字段,原语为df= @udf spk by spk.load_csv with (/data/a.csv)

  

(2)  关系型数据源的加载,比如mysql,oracle,postgresql等

首先需要定义一个json连接串,用来指定连接的地址,数据库名,用户名,密码。

格式如下

define mysql1  as ({"url":"jdbc:mysql://bigdata-89:3306","database":"test",

"user":"root","passwd":"123456"})

在mysql的test数据库里面有一张student_infos表,下面进行加载

df= @udf spk by spk.load_db with (mysql1,student_infos)

#加载student_infos表

(3)hive数据源的加载

在hive的mydb数据库里面有一张student表,下面来加载它

df= @udf spk by spk.load_hive with (mydb.student)

 

4. 对数据进行切割,提取对于日志分析数据来说,最重要的一步就是对数据进行切割,提取,这样才能进行下一步的分析。下面以美国宇航局肯尼迪航天中心WEB日志为例进行说明。

数据的下载地址为

http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html

下面就到了至关重要的一步了,对数据进行正则化提取,提取出其中的主机名,时间戳,路径,访问状态,返回的字节数这5个字段,原语命令如下

df1= @udf df by spk.reg_extract with (regexp_extract('value', r'^([^\s]+\s)', 1).alias("host"),

regexp_extract('value', r'^.*\[(\d\d/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4})]', 1).alias('timestamp'),

regexp_extract('value', r'^.*"\w+\s+([^\s]+)\s+HTTP.*"', 1).alias('path'),

regexp_extract('value', r'^.*"\s+([^\s]+)', 1).cast('integer').alias('status'),

regexp_extract('value', r'^.*\s+(\d+)$', 1).cast('integer').alias('content_size'))

#将df表的value字段进行正则表达式提取出第一个匹配的主机名,将其重命名为host列

将df表的value字段进行正则表达式提取出第一个匹配的时间,将其重命名为timestamp列

将df表的value字段进行正则表达式提取出第一个匹配的路径,将其重命名为path列

将df表的value字段进行正则表达式提取出第一个匹配的状态码,将它的类型转化为int类型并将其重命名为status列

将df表的value字段进行正则表达式提取出第一个匹配的状态码,将它的类型转化为int类型并将其重命名为status列

将df表的value字段进行正则表达式提取出第一个匹配的字节数,将它的类型转化为int类型并将其重命名为content_size列

可以看到数据已经被切割成5列了

5. 清除无效语句

根据分析目标进行清洗得到所需要的数据,下面以fea经典的cd_esql为例进行说明

日志的格式如下:

下面过滤掉日志中的错误日志

正常的日志都包含有”-mylogger-”这个字段内容,根据这个特征过滤掉错误日志。

 df1= @udf df by spk.filter with (instr('value', '- mylogger -')<> 0)

# instr('value', '- mylogger -'),value字段如果不包含- mylogger -,返回0,否则返回它所在的索引。<>表示不为0,这样就过滤掉了错误日志。

6. 分割有效字段

经过无效语句清洗,保留有效语句,但是还是不能满足我们基础DF表的要求,下面进行有效字段的分割,提取。

有效的一条语句完整结构如下:

时间(精确到毫秒)/分割符(-mylogger-)/字符串(info-)/语句(事件)

2016-03-29 13:56:13,748 /- mylogger -/ INFO -/ select * from people_trail01_dest where KSSJ>=2001-02-28T01:05:24.000Z

整条语句中就是时间与事件是分析统计有用的,要从整条语句中分割出来,

原语如下所示。

df2= @udf df1 by spk.opfield with (split(value,'- mylogger - ')[0] as d1:split(value,'- mylogger - ')[1] as event)

#将df1表的value字段按照- mylogger –分割,第一个字段并存储到d1列中、提取第二个字段存储到event列中

可以看到event列还是不能满足要求,再进行分割

7. 提取时间,日期字段

对上面的数据提取天数

还有很多数据清洗攻略,我们将在下一篇继续介绍,敬请期待!

 

FEA-spk简单,强大,可视化

不懂Java,Python同样玩转Spark

专门为数据分析师打造!

© 著作权归作者所有

共有 人打赏支持
openfea
粉丝 13
博文 86
码字总数 95615
作品 1
杭州
其他
ansible filter_plugins插件实现jinja2自定义filter过滤器

前言: filterplugins是什么? 这个单词拆解下,filter ! 熟悉jinja2模板的人,到知道他是过滤器,可以在模板中以管道的方式用pyhton的代码处理字符串。 ansible模板调用的是jinja2,这个大...

rfyiamcool
2014/07/21
0
0
爬虫练习之数据整理——基于Pandas

上一篇->爬虫练习之数据清洗——基于Pandas 目的 本次数据整理的小目标是将薪资数据拿出来单独处理为统一的格式, 以便后续的数据统计分析和可视化操作 思路 先来看看数据有多丑 薪资原始数据...

謝增光_Feson
2017/07/26
0
0
关于request.getParameter(java.lang.String name)

//前段时间比较忙,好久不写日志了。总结个基础的问题,在Grails中写java代码果然会遭报应,出错了经常没提示... 问题重现:为了便于处理分页,在前端页面添加了一个参数,定义如下: <input...

小紅
2013/11/20
0
0
打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)

原文地址为:打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)

wangchaoqi1985
05/28
0
0
专门供开发者使用的免费的虚拟机资源:超能云 (SuperVessel Cloud)

真心的好资源,先告知大家,使用入门攻略参看http://my.oschina.net/u/1431433/blog/380643 注册登录网址:www.ptopenlab.com 这个SuperVessel云平台原来只面向高校老师和学生开放,因为羊年...

lindylin
2015/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
56分钟前
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0
使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部