关于数据处理

    7月24日入职实习至今已三个多月,我很幸运一开始可以从事自己喜欢的职业:数据处理工程师(很感谢一位学长的内推),工作刚起步忙忙碌碌,加之自己惰性难改,三个多月后才开始总结工作,总结自己学到的东西,还是希望自己能够做到输入大于输出。
    首先说一下工作的环境,刚入职就是直接跟着项目走,跟着的这个项目属于比较大的一个项目,据我了解是有7家公司合作推进,包括阿里、数梦工厂等,阿里作为牵头人。工作的平台是阿里云数加平台MaxCompute,所有的操作都是在这个平台上面进行,开发使用平台的大数据套件,输出给应用使用的是分析型数据库ADS。而我的工作就是在这个平台下,进行脚本开发,数据清洗。
    MaxCompute,就我这段时间了解而言,是一个很优秀的平台,它的脚本开发并不能与MYSQL或者ORACLE进行无缝迁移,但是依旧有很多相似之处。MaxCompute平台的使用我不再赘述,前段时间阿里的云栖大会有专门的专场来聊这个,这里贴个网址,有兴趣的可以去了解:(https://yq.aliyun.com/promotion/377?spm=)
    我的工作主要分为二个阶段,前期做了一周的标签计算,后面被调入数据处理组进行脚本开发。项目的数据来源几乎都是来源于数据处理组输出的数据,所以二个我反过来介绍。
一:数据处理:
    到目前为止依旧在做数据处理,诚然,过了刚开始什么都不会什么都要学并且精力旺盛的劲头,后面的工作基本是索然无味并且复杂无聊了,当然,精力依旧旺盛。但是做了这么久,在自己心里慢慢琢磨以及阅读了《数据挖掘概念与技术》这本书后,工作的内容在我心里有了个整体的理解,资历尚浅,以下的分析有不合理之处,各位海涵,一笑而过就是。
在数据处理这方面,我主要做的是主题库的建立,由于项目接的是公安项目,较为保密,具体什么主题库不做深入解释。关于主题库的理解,根据我现在做的东西,结合数据挖掘那本书,可以将其理解为数据仓库的一类,类似于数据集市。它具有面向主题以及集成这些特征。我们需要根据决策者(这里是用户)的分析和需求,提供特定主题的数据,排除对于决策无用的数据。集成更好理解一点,将多个异构数据源(来源于多张数据源表)集成在一起,使用数据清理和数据集成技术,确保命名规范、编码结构规范、数据类型一致等特性。我理解的数据集市就是这样一个概念,他的范围是限定的主题,面向于特定的用户群,如人员、地址等等。
我们这边关于主题库具体的做法可以分为四步:
    1:数据集成:首先要根据你所做的那一个主题,确定主题库最终输出的目标表表结构,表结构的确定很重要,他要包含对这一主题有需求的用户所有想要的信息。通常表结构的确立有二种方式,第一种比较简单一些,将整个事件的整体流程都描述出来,从开始到结束,比如说一个案件从发案、处理、破案到结案的全部过程。第二种就是从所有数据来源表中,查看出现次数较多的字段,记录下来,可能作为表结构的备用字段(没错,有时候数据集成的前期就是查表的过程),除此之外,还需要根据用户需求添加字段。表结构确立完成,开始数据源表的汇总,就是多个数据源的集成,这里还是需要再次查看所有源表表结构,将有用的需要的字段添加进去。(我们这边项目有200+个源表,我总共查了所有表结构3次。。)通常数据集成的过程是无聊并且繁琐的,因为在集成数据源时,需要考虑源表是否是我需要的,即使有自己想要的数据也要判断表的侧重点,是否与这一主题相关。同时最好要注意源表的数据类型以及编码等,是否与输出目标表一致,防止后面清洗以及最后汇总时出现错误。我们在寻找到各个主体需要的数据源表后,统一集成到一张中间表中,这张中间表跟目标表表结构基本一致,不排除添加一二个字段的情况。
    2:数据清洗与数据变换:数据集成形成的中间表,一般不做清洗(去重)处理,最多简单处理一下过多的重复数据以及明显的脏数据,中间表的作用一是保证来源各个表的数据完整性,二是用于汇总到目标表。因为这张中间表与目标表不同,数据是非常完整(当然,脏数据也会很多),虽然到目前为止用户尚未对中间表有需求,但不排除如算法方面需要计算一些置信度的要求。数据由中间表汇总到目标表中,需要做一次清洗处理,清洗内容一般都是去重、处理脏数据等,每一个主题库,去重逻辑都是要慎重考虑的,因为不小心就有可能处理掉重要的数据。在做去重的时候,一般都是根据这个主题与需求之间的关系,如人与车的关系,人与物品的关系等等,在这里不得不提一个主题库中很重要的一个字段,我们把它叫做更新时间,其实准确来说是业务时间,这个时间在每一张源表中可能有其他的名称,如婚姻相关表中叫做登记时间,铁路交通相关表中叫做上车时间,等等。这个更新时间的存在是很有意义的。举个例子,一个人买了辆车,一个月去做一次保养,那么来源于这张源表中,就会有多条关于这辆车的记录,我们最后输出到目标表中,只需要一条关于这辆车的记录,那么我们在去重的时候,会在使用ROW NUMBER()这个函数partition by你所要去重的字段之后,再order by更新时间,这样就会使得所有根据去重逻辑去重的字段,按照更新时间,由大到小或者由小到大排序,最后选择最近时间的那条,相比较于其他去重的字段,这条数据是较为准确的。关于脏数据的处理,可以用阿里云平台自带的内置函数进行处理,也可以自己开发UDF处理,通常自己开发UDF较多,阿里云平台只提供基础函数处理,UDF是自己写代码,调用阿里云的udf包,对数据做相应的过滤处理。如,我前两天开发的UDF,主要是对联系电话做过滤,来源表登记的电话有多种格式,而我最后统一只要11位电话号码,将字段中非数字的字符全部过滤掉,截取11位连续数字作为新数据填入目标表。之后就是数据变换,通俗点说是各种规范,如字段数据类型规范化,时间数据规范化等,其实在数据源集成到中间表的时候,应该要做一次规范化处理,但为保最后输出的结果准确性,中间表汇总到目标表时,再进行一次数据变换。
    3:检查与刷新:至此,整个主题库的建立基本完成,后续工作主要是数据质量测试、检查数据完整性以及数据更新。数据质量的测试,一般都会在应用以及用户使用后发现问题反馈给我们进行修改,同时我们进行自检。这里主要说一下数据更新,MaxCompute这个平台,我认为最大的优点就是表可以建立分区(可以看一下阿里云官方文档)。所有主题的来源表几乎每天都有数据更新,我们的主题表也需要定期进行更新,如果每次更新都要将所有源表数据全部集成一次,数据量庞大,并且在计算时极有可能出现长尾问题。这个时候,就可以建立分区,主题库目标表建设完成的第一天,接一份所有数据源表的全量数据,之后每一天,都只接更新的增量数据,这样的好处就是,每天更新的数据量不庞大目标表可以每天更新,应用及用户在使用时,整表查询就可以查询到所有的数据。
    4:除此之外,主题库的建设让我觉得最好的一个想法就是归档表的建立。由于MaxCompute这个平台的限制,一张表只能有1W个分区,但是主题库中间表一般设二个分区,一级分区为时间,二级分区为来源表的表序号(我们有一张码表,对应各个源表以及源表的表序号),方便最后来源追溯。若来源表数量过多,如100张,那么一天就会有100个分区,100天后,主题库中间表无法更新导致目标表无法更新,这就是归档表设定的意义,它可以将表序号或者时间作为一级分区(来源表不会超过1w张,时间不会超过30年),每一个月调度一次,将中间表中,前一个月数据迁移到归档表中,再和之前的归档表进行合并(因为平台的insert方式是覆盖写入的,需要合并操作,否则会覆盖之前的数据),之后将中间表前一个月数据删除,这样中间表中,只会存在一个月的数据量,分区不会超过限制,归档表中归档了前一个月所有的数据量,二个表合并就是所有的数据。
以上是整个主题库建设的过程,我理解的是跟数据仓库建设大同小异,可以理解为数据集市,若理解有误欢迎指正。
二:标签计算:
    标签计算数据来源于主题库,我做的时间不长,但有一些自己的理解。标签计算其实可以理解为数据特征化。它是从海量数据里面,通过分析与计算,得到自己想要的结果。如标签需要计算,一个人一个月内住了多少次旅馆,那么他就可以从海量数据里面,找到旅馆信息,由登记的公民身份号码信息计算入住次数。标签计算有一个完整的系统,分为很多种,如人员,关系等。都是在数据中提取对应有价值的数据。标签计算我个人十分有兴趣,后面写爬虫会作为数据分析的一部分。
    以上是我工作三个月以来主要的工作,我在学校实验室写了二年代码(主要是JAVA),实习工作直接就是数据处理,已有较长一段时间未写深入的代码,这段时间也在接触一门新的函数式语言SCALA,论文指导老师也在督促图像识别部分,最近在看一些算法,还有一些其他的琐事,时间有点紧张,但希望可以齐头并进安排好时间,不丢弃老本行,也及时吸收新的知识。下一阶段再做总结。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值