Spark求统计量的两种方法-阿里云开发者社区

开发者社区> thinkgamer.cn> 正文

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版本就可以了

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

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4012 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
2174 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
4964 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10714 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2003 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
3809 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
723 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
2901 0
+关注
thinkgamer.cn
wechat 搜索【数据与算法联盟】,专注于云计算和算法,目前就职于京东
121
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载