开发者社区> thinkgamer.cn> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Spark求统计量的两种方法

简介: Spark对于统计量中的最大值,最小值,平均值和方差(均值)的计算都提供了封装,这里小编知道两种计算方法,整理一下分享给大家
+关注继续查看


公众号二维码
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处:https://yq.aliyun.com/u/thinkgamer
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer

Spark对于统计量中的最大值,最小值,平均值和方差(均值)的计算都提供了封装,这里小编知道两种计算方法,整理一下分享给大家

DataFrame形式

加载Json数据源

example.json文件格式如下

{"name":"thinkgamer","age":23,"math":78,"chinese":78,"english":95}
{"name":"think","age":25,"math":95,"chinese":88,"english":93}
{"name":"gamer","age":24,"math":93,"chinese":68,"english":88}
// persist(StorageLevel.MEMORY_AND_DISK) 当内存不够时cache到磁盘里
val df = spark.read.json("/path/to/example.json").persist(StorageLevel.MEMORY_AND_DISK)
df.show()
df.describe()

我们便可以看到如下的形式

+---+-------+-------+----+----------+
|age|chinese|english|math|      name|
+---+-------+-------+----+----------+
| 23|     78|     95|  78|thinkgamer|
| 25|     88|     93|  95|     think|
| 24|     68|     88|  93|     gamer|
+---+-------+-------+----+----------+

+-------+----+-------+-----------------+-----------------+----------+
|summary| age|chinese|          english|             math|      name|
+-------+----+-------+-----------------+-----------------+----------+
|  count|   3|      3|                3|                3|         3|
|   mean|24.0|   78.0|             92.0|88.66666666666667|      null|
| stddev| 1.0|   10.0|3.605551275463989| 9.29157324317757|      null|
|    min|  23|     68|               88|               78|     gamer|
|    max|  25|     88|               95|               95|thinkgamer|
+-------+----+-------+-----------------+-----------------+----------+

如果是想看某列的通知值的话,可以用下面的方式

df.select("age").describe().show()
+-------+----+
|summary| age|
+-------+----+
|  count|   3|
|   mean|24.0|
| stddev| 1.0|
|    min|  23|
|    max|  25|
+-------+----+

RDD形式

假设同样还是上边的数据,只不过现在变成按t分割的普通文本

thinkgamer  23  78  78  95
think   25  95  88  93
gamer   24  93  68  88

这里可以将rdd转换成dataframe洗形式,也可以使用rdd计算,转化为df的样例如下

val new_data = data_txt
      .map(_.split("\\s+"))
      .map(one => Person(one(0),one(1).toInt,one(2).toDouble,one(3).toDouble,one(4).toDouble))
      .toDF()

接下来就是进行和上边df一样的操作了。

那么对于rdd形式的文件如何操作:

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}

val data_txt = SparkSC.spark.sparkContext.textFile(input_txt).persist(StorageLevel.MEMORY_AND_DISK)
    val new_data = data_txt
      .map(_.split("\\s+"))
      .map(one => Vectors.dense(one(1).toInt,one(2).toDouble,one(3).toDouble,one(4).toDouble))
    val summary: MultivariateStatisticalSummary = Statistics.colStats(new_data)
    
println("Max:"+summary.max)
println("Min:"+summary.min)
println("Count:"+summary.count)
println("Variance:"+summary.variance)
println("Mean:"+summary.mean)
println("NormL1:"+summary.normL1)
println("Norml2:"+summary.normL2)

输出结果为:

Max:[25.0,95.0,88.0,95.0]
Min:[23.0,78.0,68.0,88.0]
Count:3
Variance:[1.0,86.33333333333331,100.0,13.0]
Mean:[24.0,88.66666666666667,78.0,92.0]
NormL1:[72.0,266.0,234.0,276.0]
Norml2:[41.593268686170845,154.1363033162532,135.83813897429545,159.43023552638942]

这里可以得到相关的统计信息,主要区别在于dataframe得到的是标准差,而使用mllib得到的统计值中是方差,但这并不矛盾,两者可以相互转化得到。

当然如果要求四分位数,可以转化成df,使用sql语句进行查询

Select PERCENTILE(col,<0.25,0.75>) from tableName;

本地碰见的一个错误

1:错误1

scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/Array

原因是Spark中spark-sql_2.11-2.2.1 ,是用scala 2.11版本上编译的,而我的本地的scala版本为2.12.4,所以就错了,可以在
里边把相应的scala版本就行修改就行了

2:错误2

java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V

原因也是因为我下载安装的scala2.12版本,换成scala2.11版本就可以了

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Spark Summit East 2017】Spark中的容错:从生产实践中获取的经验
本讲义出自Jose Soltren在Spark Summit East 2017上的演讲,主要介绍了Spark容错中的螺母和螺栓,他首先简述了Spark中的各种容错机制,然后讨论了YARN上的Spark、调度与资源分配,在演讲中还对于一些用户案例进行了探讨研究并给出了一些需要的工具,最后分享了未来Spark中容错未来的发展方向比如调度器和检查点的变化。
1924 0
【Spark Summit East 2017】使用Spark对仙女星系数据进行分析
本讲义出自Jose Nandez在Spark Summit East 2017上的演讲,主要介绍了使用Spark与Python API对于仙女星系的数据进行交互式数据分析,Spark-Python代码充分利用了Spark RDDs进行查询来帮助预测某一对像是否属于仙女星系。
1788 0
【Spark Summit East 2017】从容器化Spark负载中获取的经验
本讲义出自Tom Phelan在Spark Summit East 2017上的演讲,Tom Phelan探讨了如何实现高可用性的分布式大数据应用和数据中心主机,并分享了学到的经验教训,并对于如何在一个可靠的、可伸缩的、高性能的环境将大数据应用程序容器化给出了一些提示。
1836 0
【Spark Summit East 2017】基于Spark的行为分析研究
本讲义出自John W u在Spark Summit East 2017上的演讲,主要介绍了在Spark生态系统中使用机器学习技术对于一系列应用的用户行为进行分析理解的经验。在这种背景下,Spark使得大型高性能计算系统的强大计算能力可以被可用行为经济学家使用,而不需要像科学家那样去了解并行计算。
1747 0
【Spark Summit East 2017】Spark,类型函数式编程的引诱者
本讲义出自Jeff Smith与Rohan Aletty在Spark Summit East 2017上的演讲,主要介绍了如何使用Spark作为学习工具,在函数式编程等领域构建技能栈,介绍了从基础工作Scala和函数式编程的概念到完全实现机器学习管道,并讲解了Spark以及MLlib。
1609 0
【Spark Summit EU 2016】Spark中的自动检查点
本讲义出自Nimbus Goehausen在Spark Summit EU 2016上的演讲,主要介绍了面对需要自动保证Spark的数据来源以及存储路径正确,并且在对于需要保存的数据进行保存而对于需要改变的数据进行改变,所以需要在Spark工作流中使用自动检查点来对以上要求进行保障,本讲义就主要介绍了Spark中自动检查点的使用。
1959 0
【Spark Summit EU 2016】Spark的性能,过去、现在与未来
本讲义出自Sameer Agarwal在Spark Summit EU 2016上的演讲,他首先从机器的存储、网络以及CPU等硬件的性能发展变化讲起,再谈到软件中Spark IO的优化、数据格式的改进提升,并介绍了Tungsten项目,该项目的目标是大幅度地提升Spark集群的内存和CPU的执行效率,推动Spark的性能最大可能地接近硬件性能的极限。
1745 0
【Spark Summit EU 2016】在数据仓库中引入Dataframes+Parquet
本讲义出自Sol Ackerman与Franklyn D'souza在Spark Summit EU上的演讲,在已存在的数据仓库中使用Dataframes+Parquet的经验方法,实现了在保证原有代码的情况下,引进Dataframes+Parquet,并且重写比较慢的工作作为Dataframes的管道,用Spark对从输入端流入的数据进行处理并输出。
1526 0
【Spark Summit EU 2016】Bing规模下的Spark Streaming
本讲义出自Kaarthik Sivashanmugam在Spark Summit EU上的演讲,主要介绍了在微软公司的Bing搜索每月上百万次搜索请求、每小时数十TB数据量、成千上万台机器组成数据中心、以及多个数据处理框架这样的规模下的Spark Streaming的应用。
3250 0
【Spark Summit East 2017】混合云上的Spark:为何安全和治理变得愈发重要?
本讲义出自Arun Murthy在Spark Summit East 2017上的演讲,主要分享了在混合云上的Spark技术飞速发展的今天,为什么安全和治理变得越来越重要。
1642 0
+关注
thinkgamer.cn
wechat 搜索【数据与算法联盟】,专注于云计算和算法,目前就职于京东
文章
问答
文章排行榜
最热
最新
相关电子书
更多
基于Spark的面向十亿级别特征的 大规模机器学习
立即下载
Spark介绍及Spark多数据源分析
立即下载
阿里云分析引擎Spark On 多数据源介绍
立即下载