数据清洗很要命?那是因为你没看到这份攻略!
博客专区 > openfea 的博客 > 博客详情
数据清洗很要命?那是因为你没看到这份攻略!
openfea 发表于9个月前
数据清洗很要命?那是因为你没看到这份攻略!
  • 发表于 9个月前
  • 阅读 35
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

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

目前,数据的挖掘和分析,基本都是采用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

专门为数据分析师打造!

标签: FEA spark 数据清洗
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 12
博文 86
码字总数 95615
作品 1
×
openfea
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: