feilong 发表于 2017-10-27 09:45:33

Spark 高级分析:第二章第7,8节

本帖最后由 feilong 于 2017-10-27 09:57 编辑

问题导读

1.哪些方法可以做数据的聚合?
2.集群上进行数据聚合时如何优化?
3.对存储在Map类型中的数据如何排序?
4.scala集合类有哪些?如何相互转化?



static/image/hrline/4.gif



上一篇:Spark 高级分析:第二章第5,6节
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22959&page=1#pid242986


第7节 Aggregations 聚合

   本章到目前为止,我们集中讨论了在本地机器上和在集群上使用Scala和Spark处理数据的类似方法。在这一节中,我们将开始探讨Scala和Spark之间的一些区别,特别分组和聚合数据。大部分的差异是效率:当我们聚集的大型数据集分布在多台机器上时,我们更关心其传输信息的效率比单机上更高效。
   为了说明一些差异,让我们通过Matchdata在本地和集群上做一个简单的聚集,来计算匹配与不记录数的记录数。因为本地Matchdata记录在mds数组,我们将使用groupBy方法来创建一个Scala Map],其中的key基于MatchData类中的匹配字段:
   val grouped = mds.groupBy(md => md.matched)
   当获取到分号组的值后,可以调用grouped的mapValues方法计数,就行一个map对象上的方法一样获取每个数组长度。
   grouped.mapValues(x => x.size).foreach(println)
   正如我们看到的那样,所有本地实体都匹配,所以map返回值是元组(true,9)。当然,我们的本地数据只是所有数据的一个抽样;当我们将这个分组作用于整个数据时,我们希望找到不匹配的值。

   当我们在集群中对数据进行聚合时,我们总是要注意我们正在分析的数据存储在多台机器上,因此我们的聚合将需要在连接机器的网络上传输数据。在网络传输数据需要大量的计算资源:包括确定哪些机器记录将被转化,序列化数据,压缩,发送到网线,然后将解压缩的结果,最后进行计算汇总数据。为了快速做到这一点,重要的是我们要尽量减少我们传输数据量;在进行聚合之前,我们可以对数据进行更多的过滤,这样我们就可以更快地得到问题的答案。

第8节 Creating Histograms 创建直方图

   让我们开始创建一个简单的直方图统计有多少的Matchdata记录解析为匹配字段的真或假值。幸运的是,RDD 类定义了一个action操作,被称为countByValue执行这种计算非常有效并返回结果给客户端一个Map。调用countByValue对匹配场投影Matchdata将执行一个Spark作业并返回结果给客户端:

   每当我们创造的Spark客户端直方图或其他分组值,尤其是当问题的分类变量包含了大量的数值,我们希望能够以不同排序方式看直方图的内容,如通过键的字母顺序排列,或按数值计数以升序或降序排列。虽然我们的matchCounts Map只包含key(true/false),让我们简要地看一看如何以不同排序其内容。

   Scala有丰富的集合库,包括list,set,map,array。可以很容易地通过类似于toList,toSet,toArray方法从一个集合类型转换为另一个。

   Scala Map类没有针对键或值内容排序的方法,我们可以将一个Map转换成Scala Seq类型,Seq类型支持排序。Scala的Seq类似于Java的List接口,因为它是一个集合,有预先定义的长度和通过指标查找值的能力。
val matchCountsSeq = matchCounts.toSeq
    matchCountsSeq由(String,Long)类型的元素组成,可以使用sortBy方法对其排序:
matchCountsSeq.sortBy(_._1).foreach(println)
...
(false,5728201)
(true,20931)
matchCountsSeq.sortBy(_._2).foreach(println)
...
(true,20931)
(false,5728201)

sortby方法默认按数值升序排序,但在直方图中经常按降序查看。我们可以调用reverse方法在打印前作用于序列:
matchCountsSeq.sortBy(_._2).reverse.foreach(println)
(false,5728201)
(true,20931)
...
   当我们查看整个数据集上的匹配计数时,我们发现正匹配和负匹配之间有很大的不平衡;对小于0.4%的输入实际上匹配。这种不平衡对我们的记录链接模型的含义是深远的:我们所想出的数字匹配分数的任何函数都有显著的假阳性率,也就是说,许多对记录看起来像是匹配的,但实际上它们不是。

美丽天空 发表于 2017-10-28 14:23:10

感谢分享
页: [1]
查看完整版本: Spark 高级分析:第二章第7,8节