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

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

基本概念:

  • 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 深呼吸】细说CodeDom(5):类型成员

    前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...

  2. Ubuntu下使用nvm

    写在前面:刚写着写着博客就跨年了,希望新的一年大家万事如意,一切向"前"看! 安装 wget -qO- https://raw.githubusercontent.com/crea ...

  3. 三分钟学会用 js + css3 打造酷炫3D相册

    之前发过该文,后来不知怎么回事不见了,现在重新发一下. 中秋主题的3D旋转相册 如图,这是通过Javascript和css3来实现的.整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的j ...

  4. 【WCF】使用“用户名/密码”验证的合理方法

    我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...

  5. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  6. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  7. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...

  8. CSharpGL(33)使用uniform块来优化对uniform变量的读写

    CSharpGL(33)使用uniform块来优化对uniform变量的读写 +BIT祝威+悄悄在此留下版了个权的信息说: Uniform块 如果shader程序变得比较复杂,那么其中用到的unifo ...

  9. HTML5笔记2——HTML5音/视频标签详解

    音视频的发展史 早期:<embed>+<object>+文件 问题:不是所有浏览器都支持,而且embed不是标准. 现状:Realplay.window media.Quick ...

  10. SQL-日期函数

    GETDATE() :取得当前日期时间 DATEADD (datepart , number, date ),计算增加以后的日期.参数date为待计算的日期:参数number为增量:参数datepar ...