miaojiyao

  最近几年大数据经常和云计算,物联网一同被IT行业追捧,这几个科技词汇经常在各个科技网站中占据头条不下,现在又多了个人工智能。通常所指的大数据分析技术是指利用多是Java技术体系的MapReduce,Spark,Hadoop,Hive,Hbase,Pig,YARN,Flume,Kafka,Zookeeper等大数据分析各个过程中发挥强大功能的项目或工具来实现对数据进行信息挖掘。但是我不了解这些项目,我首先是个C#和前端程序员不是专门的大数据分析师,但我想在这个大数据时代根据自身公司的数据做些事情,所以,针对大数据,本人从个人的角度谈一下看法,所以标题就为数据分析,但是大数据的利用和我谈的是如出一辙,只不过手段和数据量级不同。

  数据是企业的资产,尤其是做IT行业,还是任何一家公司,公司内部的数据以及市场数据更是宝贵的财产,大数据就是从海量数据中挖掘信息。大数据是有趣的,最先也是因为它所得到结果的有趣性才被更生动和亲切的方式被社会和媒体所关注。我认为所谓的大数据无非是事件的结果数据,发生事件本体,以及外部其他事件,它们之间的相关性分析。

  大数据分析的过程,以及采用的技术手段不重要,重要的是结论。首先知道产生结论前得知道自己想要证明什么,大数据一般都会把相关性的结论展示给普通人,然后人们喜闻乐见:哦,原来还有这样的规律。但是不要忽视:从过程上来讲,没有人们想要看到的结果或者说结果没有相关性也是一种结果。因为证明什么事情之间没有关系和它们有关系对于技术过程来讲是等价值的,但是对于深层的知识获得来讲通常是为了探索因果关联。

  对于一般企业或IT公司见到大数据这个词汇时不要被它在互联网巨头以及科技媒体的大肆宣扬下所吓倒或迷茫,我们要从零开始拥抱大数据,大数据是随着互联网,移动互联网,尤其是电子商务的普及产生海量数据,所以工程师采用全新的技术来响应数据报表,分析,挖掘的需求。

  大数据分析和传统数据分析的最大不同除了数据的4V特征,我觉得是分析的灵活化,也就是有趣化,传统的分析通常是在固定模式下少量变量下的简单分析,通常是我们先知道我们想要什么,然后得到什么,大数据分析,就需要我们开阔发散我们的想法和思维,更多的是无模式,然后等到信息展示,我们才知道这是我们想要的,如果有些结论证明常用,我们就可以将分析过程模块化,这样又成了有模式的,但是思维还应该保持创造力和想象力,去发掘更多的规律信息。

  分析场景是需要想象力的,举一些通俗例子:有个IT男觉得结婚这么难,他想知道全国的男人们结婚有多难,好了,他可以全国结婚成本调查(这种调查一般是贴吧中各地用户发帖);比如:上海房价这么高,有人做了房价地图(百度echarts有案例);然后单身女性的生活方式(发现大多数都是唯美食和旅游不可缺);或者离婚率分布(经济越发达地区(北上广))离婚率越高,有些经济欠发达地区(新疆)也高,中等发达地区通常很低,陕西省最低)。

  更多的分析是为了更智慧更人性的服务于社会大众,比如:高德地图可以根据高德产品用户数据就算出全国城市各个道路各个时间段的拥堵程度;可以根据出租车轨迹算出城市个区域的活跃度。

  大数据是伴随着互联网在人们生活的各个方面扮演了重要角色,用户产生的数据迅速增长的背景下应运而生,互联网平台,尤其是电商平台和生活服务类,它们中的数据量更是庞大,可以分析的场景更是丰富,比如:淘宝罩杯大小和用户所在城市的关联分析;情人节前日玫瑰在各个城市的销量;链家网根据用户的工作,收入,以及子女情况与房源智能匹配。接下来以工作业余时间案例来浅谈数据分析在传统互联网企业的实施过程以及如何利用数据分析丰富现有系统的功能和挖掘新的系统需求。接下来分别介绍大数据重要三要素:数据,算法,产品。

  数据就是企业业务数据,运营数据,或者物联网监测数据。比如:直播平台中的主播和粉丝数据,以及粉丝的礼物赠送数据,地铁各个站点的人流量数据。以全国城市的空气质量监测数据为例,从网上下载公开的数据Excel文件。

 

用于数据分析的批量CSV文件 

                               用于数据分析CSV文件内部格式 

  数据分析前提是要有想要进行分析的数据,数据可以是我们的数据库表,也可以是HDFS文件,也可以是任何形式,比如最简单的Excel文件。不论是放在Oracle,SQL Server关系数据库还是MongoDb,还是HDFS中,还是Excel或者文本文件中。虽然大数据的Variety特征数据的结构可能很凌乱但是除非是自然语言处理这样的应用,通常我们的数据还是有结构模式的,即使是放在MongoDb这些非关系数据库中也是有结构的,只不过结构更加灵活而已。所以数据分析可以根据在分析过程中的作用分离成单独的模块。

  数据分析的手段可以多种多样。当然对于程序员,如果你熟悉sql语句,你完全可以用sql语句来得到你想要的结果;如果你熟悉LINQ,也完全可以用LINQ或泛型函数语句,如果你熟悉函数式编程,你也完全可以使用Map和Reduce两个函数来进行你的数据分析;当然我们最好使用些别的封装好的工具和函数。我采用的是Python语言中的Pandas数据分析库。数据分析得先知道自己想要做什么。

我想知道空气中各种污染因子是否和当天的时辰相关,时辰可能反映着温湿度和社会活动。然后结果如下:

开封市2016年的臭氧每个小时平均和日平均正则化 

        

  金华市2016年的二氧化氮小时平均和日平均正则化

 

通过全国各个城市的各个因子这样的分析发现,PM2.5和PM10通常和小时没有关联性,其他SO2,NO2,O3,CO通常和小时有关联。

我想知道空气各种因子和季节有关系没(O3夏天高,AQI春冬高)。然后结果如下:

 

 

    长春市2016年各月份的臭氧日平均分布   

        

    保定市2016年各周的AQI日平均分布

 

 

然后我想知道和星期几有关系没(结果显示没有明显的关系):

    平顶山市2016年各周的PM10日平均分布 

都说海口空气质量好,到底有多好,和开封比较一下(2017年1月-2月数据,横轴表示污染指数,越高说明污染越严重,纵轴表示期间污染程度的累积小时数):


                 

 开封市2017年1-2月AQI分布小时累计图

    海口市2017年1-2月AQI分布小时累计图

  数据分析的第二步是算法,当然上面的分析也用到了算法,这里讲的算法是广义的,是指将原始数据处理得到结果数据的具体技术实现,可以是SQL语句,可以是程序代码,以及程序中用到的关键的第三方类或函数。可以非常简单就是排序汇总,也可以是高级复杂的回归分析,聚类分析。举例如下:

我想看看每一天的数据波动情况:

 

 

安阳市 2017年1月-2月小时数据日平均AQI(最大值,最小值,平均值,中值)

我想知道某个城市某年各月的AQI(颜色各代表:优,良,轻度,中度,中度):

    某城市 2016年各月份五种空气质量情况的天数

  在介绍算法时可以看到无论是数据分析,还是大数据分析,最重要的是你的想法,你想知道什么,即使你不知道结果是什么样子的但你知道我想找点结论,当然也不能张口就说不可能的事,你得知道我已有的数据可以产生哪些有价值的结论,而不是天方夜谭,脱离了系统业务和数据本身(这是某些不懂数据业务的领导经常犯的错误)。不止是数据分析,任何有长远效益和价值的东西都脱离不了流程规范化和数据度量化。还有就是多学习别人家的系统怎么做的,有哪些亮点,可以为我所用,比如仿照真气网的一张图尝试着去分析到这样的结果(全国城市年排名)

 

全国大中城市2016全年空气质量排名

  大家可以看到由传统的分析,我们可能永远看不到有些结论,传统的分析多是折线图,饼图,柱状图,用在报表中,但是没有去真正发掘数据的价值,或者说所有数据的价值。如果说传统的多是数据在单一维度上简单分析,大数据分析就是充分利用好所有维度的信息,去发掘出信息,而这些信息反应的结果更加直观形象,更加耐人寻味。当然,这些分析离不开算法,数据分析中的算法通常是封装好的统计或模型函数,假如没有算法的话用普通方法取到这些结果很费劲很笨重而且易错不灵活。

  最后谈一下产品,上面我们这样做了,这样分析了,但是客户不是程序员,这些东西太分散了,所以我们要开发成产品,或者以功能模块融合到我们的系统中来。

  我觉得大数据产品有三个层级:

  第一种是面向技术本身的,其实就是大数据的软件项目或Java体系中的利用大数据技术搭建成一个环境。

  第二种是设计架构就是面向数据本身的,将算法和数据抽象成接口,形成自己的大数据分析平台,但是是由培训过的有一定数学统计专业知识的人来使用。用户使用之前得知道自己想干什么,然后利用这里的资源去组合算法和数据,以及可视化。适合拥有海量数据的互联网大企业或政府大系统内部使用,来监测平台和发掘平台信息。

  第三种是设计架构面向场景本身的,我们将我们分析过的有价值场景,封装成场景接口,然后给我们的普通用户使用。我觉得这种适合传统的IT企业,尤其是政府数据量不大的项目。

  说到数据量,我觉得结构化单表数据10G以下的数据都可以不用集群来构建Hadoop也可以实现大数据分析,通常情况下80%的系统都达不到这个数据,注意我讲的是结构化单表,不包含表中其他大文件二进制数据。(10G指的是10485760条,记录大小为1K千万量级)。在数据和算法过程中利用“分而治之”的技巧也可以实现100G以下分析。TB级或更高的海量数据就要利用真正的大数据分析技术来实现。

  我讲的是第三种数据分析产品,以自己的观点简单介绍一下如何构建:

  第一,数据分析场景的挖掘,挖掘出我想做些什么,这个认知最好让大家讨论,发散思维,然后确定哪些场景可以实现,通常情况下只要场景需要的数据我们都有,这个场景是绝对可以实现的。

  第二,分析过程各模块的开发,通常分为:数据加载模块,数据分析模块,数据可视化模块,就是数据加载模块的开发,怎么将数据先根据预条件过滤初步加载。要注意模块化,存储和数据本身结构的分离。

  第三,构建用户交互的系统,通常我们用的是B/S架构,所以这一层就是通常的平台架构,通常包含各个场景入口,以及场景参数的预加载,然后就是将场景分析封装成web api,由浏览器提交分析指令,后台调用分析模块,然后返回分析结果,前台实现可视化,虽然这个过程耗费时间和功夫,但是意义和价值不言而明,是我们整个数据分析的入口,也是数据分析像用户展示的门户。

  最后谈谈如何高效率开发数据分析平台,首先得接触到我们的数据,通常我们可以将业务数据库同步到另一个地方,以减少大数据分析时的大量读操作对原来业务系统造成数据库压力,也可以按照时间将数据库数据分区到csv文件中,根据预过滤条件首先读取对应csv文件到内存中,然后和数据库最新时间节点数据合并,这样可以减少数据库读写次数,当然前提是你的程序读取csv记录比数据库记录快的多的情况下可以这样做,或者根据时间节点分区放到对应的缓存中,每次将缓存数据和最新数据合并,这样数据加载就会比每次从数据库全部加载快的多。然后开发过程中模块化,各个步骤尽量封装,尽可能函数参数化,这样我们的数据分析开发完成后使用起来就会很灵活,至于和用户最接近的当然是数据可视化,我们可以利用JavaScript图表库,这里极力推荐百度的echarts图表和可视化库,图表类型丰富,功能强大,体验友好,api灵活,是大数据可视化的不二选择。下面是我做的web上调用数据分析以及可视化的两个截图:

根据城市和因子以及统计规则得到日平均数据的日历热力图

根据城市和因子以及事件类型,统计规则得到的历史趋势图(因子比较,也可城市比较)

  当然上面的不一定非得是顺序流程,它们之间也可以有作用角色交集以及开发过程和运行过程平行。比如我们可以将常用数据预过滤后全部加载,然后B/S平台之间调用分析,也可以B/S平台实现加载指令,分布加载。数据可视化可以在第二模块预开发,也可以在第三模块预开发,通常前者是利用后台绘图库,或Excel等绘图工具,自己先看效果,后者是利用JavaScript或Flash绘图库给用户呈现。再比如,有些数据算法可以在web页面上利用JavaScript运行,从而可以减少自己的系统调用资源。关键是根据自己的资源和数据平衡。

 

  真正的大数据分析技术提供了所有大数据分析各个过程的解决方案,真的是包罗万象,无所不有。和我上面介绍的技术比较简直小巫见大巫,但是许多思想是不谋而合的。但是大数据技术提供了更灵活更强大的支持:比如,要将分析封装成接口调用,Hbase提供了REST,Thrift,Avro来实现异构系统的跨语言通信。数据预过滤Hbase有预过滤器来提高处理表中数据的效率。

Hadoop和相关技术

  当然,上面的自己的数据分析分享只是根据自己工作对数据分析的认识,案例只是很简单很小规模数据(1G左右纪录)的分析,当面对真正的TB级,PB级数据时就需要Hadoop及相关技术来完成我们的分析得到我们想要的结果,在这里我只是抛砖引玉,希望有掌握Hadoop及相关大数据技术的同仁也分享实战经验来和大家学习和交流。

分类:

技术点:

相关文章: