1.5 使用Scala和Spark的Notebook工作
通常,这五种数字汇总方式不足以对数据形成初步认识。描述性统计(descriptive statistics)的术语非常通用,并且可以采用非常复杂的方法来描述数据。分位数和帕雷托图(Pareto chart)都是描述性统计的例子,当分析一个以上的属性时,相关性也是。在大多数情况下都能查阅到这些数据汇总的方法,但通过具体的计算来理解这些方法也很重要。
Scala或者Spark Notebook(https://github.com/Bridgewater/scala-notebook, https://github. com/andypetrella/spark-notebook)记录了完整的执行过程,并且保存为一个基于JSON的*.snb文件。Spark Notebook项目可以从http://spark-notebook.io?上下载,本书提供了一个例子文件Chapter01.snb。对于Spark的使用,会在第3章中进行更详细的讨论。
Spark可以运行在本地模式下,这是一种特殊情形。即使在本地模式下,Spark也可以在单机上进行分布式计算,不过会受机器的CPU核(或超线程)的数量限制。对配置进行简单修改后,Spark就可在一个分布式集群上运行,并能使用多个分布式节点上的资源。
下面这组命令可用于下载Spark Notebook,并从代码库中复制所需的文件:
在浏览器地址栏上输入http://localhost:9000来打开Notebook,具体如图1-2所示:
图1-2 以列表形式来展示Spark Notebook的首页
通过点击来打开Chapter01 notebook。语句被组织成多个单元,并可通过点击顶部那个向右的小箭头来执行每个单元(其结果如图1-3所示)。也可通过菜单Cell→Run All来一次性运行所有的单元。
首先来观察一下离散的变量。比如得到另一些观察属性。如果像下面的代码影响了标签的分布,就不可能这样做:
在MacBook Pro上第一次读入这个数据集可能需要几分钟,但是Spark会把数据缓存在内存中,随后的汇总只需要一秒钟左右。Spark Notebook给出了数据值的分布,如图1-4所示。
通过查看离散变量对的交叉表计数(使用http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrameStatFunctions)来理解变量之间相互依赖的关系。DataFrameStatFunctions不支持相关度量计算,如卡方等(见图1-5)。
图1-3 执行notebook中的前几个单元任务
图1-4 计算分类字段的值的分布
图1-5 列(contigency)联表(或交叉表)
从这里可以看出:最流行的服务是private,并且和SF 标志相关。分析依赖关系的另一种方法是看为0的项。比如,S2和S3标志明显和SMTP以及FTP流量相关,因为其他项的值都是0。
当然,最有趣的是与目标变量的相关性,但这些都可通过监督学习算法(在第3章和第5章会详细介绍)来更好地得到。
类似地,可以通过dataFrame.stat.corr()和dataFrame.stat.cov()函数计算数值变量的相关性(见图1-6)。该类支持皮尔森相关系数。另外,也可以直接在Parquet文件上使用标准的SQL语句:
最后计算百分数。这通常会对整个数据集排序,其代价非常大。但如果要比较的是第一个或最后一个,通常可对计算进行优化:
从Spark Notebook的部分示例代码可看出计算更通用的精确百分位数会有更高的代价。
图1-6 使用org.apache.spark.sql.DataFrameStatFunctions计算简单的汇总