数据清洗模块,包括几十个子模块, 这些子模块包含四类:生成, 转换, 过滤和执行。

数据清洗可以通过组合多个不同的子模块,生成多样的功能,通过拖拽构造出一个工作流,它能够产生一个有限或无限的文档序列。比如下面:

基本概念:

  • ETL:即数据清洗,包含抽取(E),转换(T)和加载(L)
  • 行,列: 在数据表格上的行列
  • 流,子流:一个流代表一组模块构成链条,子流也是流,只不过是被别的流调用的,可以将流理解为函数
  • 模块:构成流中的一个个的组件,分为生成,转换,过滤和执行
  • 原列名: 一个模块的输入,如果有多个输入,中间可以用空格分割
  • 新列名: 一个模块的输出

一个简单的入门例子

本例子不包含爬虫,仅演示清洗的部分功能:

  • 拖入(不是双击)生成区间数,添加一列,列名叫A,范围为1-20,间隔为1:
  • 再拖入另外一个生成区间数,列名为B,范围1-40,间隔为2,注意生成模式为Merge。
  • 向B列拖入数值过滤器,最大值和最小值分别为30和20
  • 拖入写入数据表,表名随意填写

点击执行,查看生成的表格。

从这个例子我们可以看出数据清洗的一般模式。将一个模块拖入到一列,该模块就会作用到该列上。

四类模块的详细使用方法,将会在各自的文档中说明。

调试模式和执行模式

调试模式

在编辑流的过程中,处于调试模式,为了保证快速地计算和显示当前结果,只显示前20个数据,(可在调试采样量中修改)。此时,所有执行器都不会参与到工作流中,意味着数据库和数据表都不会被写入和更新。

在调试时,从爬虫转换模块可能会请求web数据,为了提升性能,该模块对请求做了缓存。保证数据只需获取一次,如果想强制刷新数据,将从爬虫转换模块禁用,再启用,原始缓存数据就会被擦除。

执行模式

只有点击执行时,才会切换到执行模式。系统会切入到串行/并行模式,并行模式可以设置最大工作线程数,只有之前的工作线程完成工作,才会填入新的任务。 点击执行后,为了保证执行过程不受干扰,建议不要再修改各个模块的参数,此时刷新结果按钮无效,要想重新强制刷新,必须保证当前工作流停止生成数据,可参考本文档【任务管理】一节。

任务管理

不论是调试还是执行模式,系统都会在任务管理视图中增加一个或多个任务。
你可以勾选,或取消勾选部分或全部任务,暂停或取消它们。当网站限制抓取时,可以暂停所有任务,等恢复后再次执行。

  • 注意
    当你设计的工作流有误时(比如该列所有数据都空,却在该列添加了【空对象过滤器】,那么所有数据都会被过滤)可能不会产生任何数据输出。此时进度条并不会向前推进,可行的方法就是将其取消掉。

任务取消和暂停机制是基于流模式的,例如一个执行1000次算法A的循环,在执行完某次后即可取消,但如果算法A执行一次消耗的时间非常长,那么系统是无法在算法A执行过程中取消的。此时,即使你点击了取消,任务还是会保留在队列中。因此,建议循环中的任意一个处理单元,都不要做过于复杂的操作。

脚本系统

Hawk可以嵌入Python,从而支持精细的控制,实现用图形界面难以操作的功能。Hawk使用IronPython作为解释器,其语法和Python3接近。

在定制抓取任务时,我们可以在界面上双击模块,修改工作流的参数,如采集不同城市的数据,之后再进行保存。
但这种做法比较麻烦,容易出错。因此,我们可以在工程文件的同一级目录放置Python脚本,在加载任务时,脚本会自动执行。

3.单步调试

已经编写的工作流,可能会因为某些外界环境的变化而出错,此时需要排除错误,我们可以使用单步调试:
还是上面A+B=C的例子:
在属性对话框,调试窗口里,填写模块数量为1,点击刷新结果,此时,系统会只执行第一步,显示A列。
点击单步调试,模块数量变为2,显示A和B列。
本质上,单步调试只是提取了工作流的一部分进行操作,你可以在单步调试中,拖入新的模块。模块会自动插入在工作流中间。

4.组合多个工作流

有时,不可能把所有的任务都在同一个工作流中实现。如果把工作流拆成不同的子流,那么就能方便重用和组合。
我们以Hawk-Project的大众点评为例讲解,可以加载工程后自行研究。之前已经讲过思路,这里我们只讲大概的轮廓:
大众点评区域能够获取一个城市所有的区县:

大众点评类别能够获取城市的所有美食种类。
之后,我们用大众点评门店,来调用刚才实现的两个子流:
拖入从ETL生成大众点评门店,按照如下方式配置:

我们对必要的列名进行修改,之后再拖入另一个从ETL生成,配置如下,尤其注意生成模式改为Cross

这样就能生成所有区县下,所有美食门类的组合。
之后,按照之前介绍的方式,即可抓取所有美食信息。

组合子模块的功能包含三类:ETL执行,ETL转换和ETL生成。为什么不包括ETL过滤?因为过滤操作通常比较简单,不需要子流实现。

  • ETL生成,作为生成器,一般在主流的开头位置。
  • ETL转换,可看成转换器,通常位于中间位置。
  • ETL执行:作为执行器,一般位于末尾。

值得指出,子流还可以调用其他的子流,形成树状的调用结构。
当加载一个任务时,该任务依赖的子任务也会自动加载。对子流的修改,也会传递到主流上。

原理

C#版本的解释

数据清洗的本质是动态组装Linq,其数据链为IEnumerable<IFreeDocument>IFreeDocumentIDictionary<string, object>
接口的扩展。 Linq的Select函数能够对流进行变换,在本例中,就是对字典不同列的操作(增删改),不同的模块定义了一个完整的Linq
流:

result= source.Take(mount).where(d=>module0.func(d)).select(d=>Module1.func(d)).select(d=>Module2.func(d))….

借助于C#编译器的恩赐, Linq能很方便地支持流式数据,即使是巨型集合(上亿个元素),也能够有效地处理。

Python版本的解释

由于Python没有Linq, 因此组装的是生成器(generator), 对生成器进行操作,即可定义出类似Linq的完整链条:

for tool in tools:
    generator = transform(tool, generator)

详细源代码,可以参考Github上的开源项目https://github.com/ferventdesert/etlpy/

Hawk 4. 数据清洗的更多相关文章

  1. Hawk 6. 编译和扩展开发

    Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...

  2. Hawk 4.3 转换器

    转换器是最为常用的一种类型,当然它的使用也是最复杂的. 转换器有三种子类型: A:单文档->单文档:例如仅将某一列的字符提取出来 B:单文档->多文档:典型的如从爬虫转换,每一行url都可 ...

  3. # Hawk:开源贡献计划,设计,反思

    Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心.软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力. ...

  4. 设计爬虫Hawk背后的故事

    本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...

  5. Hawk 5. 数据库系统

    Hawk在设计之初,就是以弱schema风格定义的.没有严格的列名和列属性.用C#这样的静态强类型语言编写Hawk,其实并不方便.但弱schema让Hawk变得更灵活更强大. 因此,Hawk虽然之前支 ...

  6. Hawk 4.6 并行化

    并行化 Hawk支持单机并行化,也就是使用多线程获取数据.它可以控制目前所有任务的数量,为了不给网站造成过大的压力,仅当任务池中的任务数量小于一定值后,才会插入新的任务. 你可以在数据清洗的 执行面板 ...

  7. Hawk 2. 软件界面介绍

    2. 软件界面介绍 1. 基本组件 Hawk采用类似Visual Studio和Eclipse的Dock风格,所有的组件都可以悬停和切换.包括以下核心组件: 左上角区域:主要工作区,任务管理. 下方: ...

  8. Hawk 3. 网页采集器

    1.基本入门 1. 原理(建议阅读) 网页采集器的功能是获取网页中的数据(废话).通常来说,目标可能是列表(如购物车列表),或是一个页面中的固定字段(如JD某商品的价格和介绍,在页面中只有一个).因此 ...

  9. Hawk 1.2 快速入门2 (大众点评18万美食数据)

    本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...

随机推荐

  1. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  2. 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入

    说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析 ...

  3. 创建 OVS Local Network - 每天5分钟玩转 OpenStack(129)

    上一节我们完成了 OVS 的准备工作,本节从最基础的 local network 开始学习.local network 不会与宿主机的任何物理网卡连接,流量只被限制在宿主机内,同时也不关联任何的 VL ...

  4. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  5. linux centos中添加删除修改环境变量,设置java环境变量

    前言 安装完软件必要添加环境变量.指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋.好吧,好记星不如烂笔头.当然,最重要的是,百度出来的都他妈的是如何添加环境变量,只 ...

  6. JavaScript 正则表达式语法

    定义 JavaScript定义正则表达式有两种方法. 1.RegExp构造函数 var pattern = new RegExp("[bc]at","i"); ...

  7. Android 死锁和重入锁

    死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...

  8. https 安全验证问题

    最近为了满足苹果的 https 要求, 经过努力终于写出了方法 验证 SSL 证书是否满足 ATS 要求 nscurl --ats-diagnostics --verbose https://你的域名 ...

  9. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  10. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...