文档章节

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

openfea
 openfea
发布于 2017/08/10 10:57
字数 1631
阅读 132
收藏 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
粉丝 14
博文 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
办公室细菌数量排行榜 女生办公桌比男生的脏

你的办公桌是否常收拾,桌面的键盘是不是有经常清洗,这些在办公族当中经常用的东西,其实都挺脏的,专家说,最适合微生物生长的温度是25℃~37℃,此时要好好整理一下办公室经常用的东西,该...

Ackarlix
2011/03/29
199
1
打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)

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

wangchaoqi1985
05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

127.0.0.1 和 0.0.0.0 地址的区别

1. IP地址分类 1.1 IP地址表示 IP地址由两个部分组成,net-id和host-id,即网络号和主机号。 net-id:表示ip地址所在的网络号。 host-id:表示ip地址所在网络中的某个主机号码。 即: IP-a...

华山猛男
36分钟前
10
0
解决Unknown host 'd29vzk4ow07wi7.cloudfront.net'. You may need to adjust the proxy settings in Gradle.

把 总项目 下的 build.gradle 中的 两个 jcenter() 用 maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’} 代替。...

lanyu96
41分钟前
3
0
基于redis的分布式锁

redisson提供了基于redis的分布式锁实现方式,本文就尝试了下锁的使用方式。Redisson同时还为分布式锁提供了异步执行的相关方法,第二节执行介绍。 一、可重入锁验证 同一个jvm里面同一线程的...

noob_chr
50分钟前
10
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linux-tao
52分钟前
3
0
设计模式“6”大原则!

面向对象设计原则 概述 对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要...

Java干货分享
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部