Apache Spark中使用DataFrame的统计和数学函数

1. 随机数据生成功能
2. 摘要和描述性统计功能
3. 样本协方差和相关性功能
4. 交叉表(又名列联表)
5. 频繁项目(注: 即多次出现的项目)
6. 数学函数

1.随机数据生成

```In [1]: from pyspark.sql.functions import rand, randn
In [2]: # 创建一个包含1列10行的DataFrame.
In [3]: df = sqlContext.range(0, 10)
In [4]: df.show()
+--+
|id|
+--+
| 0|
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
| 7|
| 8|
| 9|
+--+

In [4]: # 生成其他两列, 分别使用矩形分布(uniform distribution)和正态分布(normal distribution).
In [5]: df.select("id", rand(seed=10).alias("uniform"), randn(seed=27).alias("normal")).show()
+--+-------------------+--------------------+
|id|            uniform|              normal|
+--+-------------------+--------------------+
| 0| 0.7224977951905031| -0.1875348803463305|
| 1| 0.2953174992603351|-0.26525647952450265|
| 2| 0.4536856090041318| -0.7195024130068081|
| 3| 0.9970412477032209|  0.5181478766595276|
| 4|0.19657711634539565|  0.7316273979766378|
| 5|0.48533720635534006| 0.07724879367590629|
| 6| 0.7369825278894753| -0.5462256961278941|
| 7| 0.5241113627472694| -0.2542275002421211|
| 8| 0.2977697066654349| -0.5752237580095868|
| 9| 0.5060159582230856|  1.0900096472044518|
+--+-------------------+--------------------+```

2.摘要和描述性统计信息

```In [1]: from pyspark.sql.functions import rand, randn
In [2]: # 一个略微不同的方式来生成两个随机的数列
In [3]: df = sqlContext.range(0, 10).withColumn('uniform', rand(seed=10)).withColumn('normal', randn(seed=27))

In [4]: df.describe().show()
+-------+------------------+-------------------+--------------------+
|summary|                id|            uniform|              normal|
+-------+------------------+-------------------+--------------------+
|  count|                10|                 10|                  10|
|   mean|               4.5| 0.5215336029384192|-0.01309370117407197|
| stddev|2.8722813232690143|  0.229328162820653|  0.5756058014772729|
|    min|                 0|0.19657711634539565| -0.7195024130068081|
|    max|                 9| 0.9970412477032209|  1.0900096472044518|
+-------+------------------+-------------------+--------------------+```

```In [4]: df.describe('uniform', 'normal').show()
+-------+-------------------+--------------------+
|summary|            uniform|              normal|
+-------+-------------------+--------------------+
|  count|                 10|                  10|
|   mean| 0.5215336029384192|-0.01309370117407197|
| stddev|  0.229328162820653|  0.5756058014772729|
|    min|0.19657711634539565| -0.7195024130068081|
|    max| 0.9970412477032209|  1.0900096472044518|
+-------+-------------------+--------------------+```

```In [5]: from pyspark.sql.functions import mean, min, max
In [6]: df.select([mean('uniform'), min('uniform'), max('uniform')]).show()
+------------------+-------------------+------------------+
|      AVG(uniform)|       MIN(uniform)|      MAX(uniform)|
+------------------+-------------------+------------------+
|0.5215336029384192|0.19657711634539565|0.9970412477032209|
+------------------+-------------------+------------------+```

3.样本协方差和相关性

```In [1]: from pyspark.sql.functions import rand
In [2]: df = sqlContext.range(0, 10).withColumn('rand1', rand(seed=10)).withColumn('rand2', rand(seed=27))

In [3]: df.stat.cov('rand1', 'rand2')
Out[3]: 0.009908130446217347

In [4]: df.stat.cov('id', 'id')
Out[4]: 9.166666666666666```

```In [5]: df.stat.corr('rand1', 'rand2')
Out[5]: 0.14938694513735398

In [6]: df.stat.corr('id', 'id')
Out[6]: 1.0```

4.交叉表(列联表)

```In [1]: # 创建一个以(name, item)为字段名的DataFrame
In [2]: names = ["Alice", "Bob", "Mike"]
In [3]: items = ["milk", "bread", "butter", "apples", "oranges"]
In [4]: df = sqlContext.createDataFrame([(names[i % 3], items[i % 5]) for i in range(100)], ["name", "item"])

In [5]: # 查看前10列数据.
In [6]: df.show(10)
+-----+-------+
| name|   item|
+-----+-------+
|Alice|   milk|
| Mike| butter|
|Alice| apples|
|  Bob|oranges|
| Mike|   milk|
|  Bob| butter|
| Mike| apples|
|Alice|oranges|
+-----+-------+

In [7]: df.stat.crosstab("name", "item").show()
+---------+----+-----+------+------+-------+
+---------+----+-----+------+------+-------+
|      Bob|   6|    7|     7|     6|      7|
|     Mike|   7|    6|     7|     7|      6|
|    Alice|   7|    7|     6|     7|      7|
+---------+----+-----+------+------+-------+```

5.出现次数多的项目

```In [1]: df = sqlContext.createDataFrame([(1, 2, 3)if i % 2 == 0 else (i, 2 * i, i % 4) for i in range(100)], ["a", "b", "c"])

In [2]: df.show(10)
+-+--+-+
|a| b|c|
+-+--+-+
|1| 2|3|
|1| 2|1|
|1| 2|3|
|3| 6|3|
|1| 2|3|
|5|10|1|
|1| 2|3|
|7|14|3|
|1| 2|3|
|9|18|1|
+-+--+-+

In [3]: freq = df.stat.freqItems(["a", "b", "c"], 0.4)```

```In [4]: freq.collect()[0]
Out[4]: Row(a_freqItems=[11, 1], b_freqItems=[2, 22], c_freqItems=[1, 3])```

```In [5]: from pyspark.sql.functions import struct

In [6]: freq = df.withColumn('ab', struct('a', 'b')).stat.freqItems(['ab'], 0.4)

In [7]: freq.collect()[0]
Out[7]: Row(ab_freqItems=[Row(a=11, b=22), Row(a=1, b=2)])```

6.数学函数

```In [1]: from pyspark.sql.functions import *
In [2]: df = sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14)

In [3]: # 你可以参照(reference)一个列, 或者提供一个列名
In [4]: df.select(
...:   'uniform',
...:   toDegrees('uniform'),
...:   (pow(cos(df['uniform']), 2) + pow(sin(df.uniform), 2)). \
...:     alias("cos^2 + sin^2")).show()

+--------------------+------------------+------------------+
|             uniform|  DEGREES(uniform)|     cos^2 + sin^2|
+--------------------+------------------+------------------+
|  0.7224977951905031| 41.39607437192317|               1.0|
|  0.3312021111290707|18.976483133518624|0.9999999999999999|
|  0.2953174992603351|16.920446323975014|               1.0|
|0.018326130186194667| 1.050009914476252|0.9999999999999999|
|  0.3163135293051941|18.123430232075304|               1.0|
|  0.4536856090041318| 25.99427062175921|               1.0|
|   0.873869321369476| 50.06902396043238|0.9999999999999999|
|  0.9970412477032209| 57.12625549385224|               1.0|
| 0.19657711634539565| 11.26303911544332|1.0000000000000002|
|  0.9632338825504894| 55.18923615414307|               1.0|
+--------------------+------------------+------------------+```

下一步是什么

0 条评论

• 使用 vmstat 监控系统性能

vmstat 是一种实时收集和报告有关系统内存，交换和处理器资源利用率数据的工具。它可用于确定有关性能的根本原因以及与内存使用相关的问题。

• 移动广告库为企业数据带来重大风险

每天在 Mojave Threat Labs，我们的研究团队都会使用超过 200 个个人风险因素来分析数以千计的移动应用程序。我们跟踪的关键风险因素之一是收集并...

• 量子物联网离我们还有多远

谷歌预计在年底宣布它已经实现量子计算的优势——量子计算设备处理传统计算机不能解决的问题的能力。考虑到有限数量的公司直面这一挑战并不使人意外，而谷歌恰巧是其中之一...

• 一文带你看懂自动驾驶

汽车智能化技术在减少交通事故、缓解交通拥堵、提高道路及车辆利用率等方面具有巨大潜能，已成为众多企业的竞争热点。我国发布的《中国制造 2025》中明确指出将智能网...

• 服务器端口怎么查 云服务器端口修改

我们使用iis的时候会出现端口占用的情况，这种情况我们总是需要打开注册表来查看哪些端口被占用，但是既麻烦又容易出错。那么我们应该如何修改或者查看端口呢？ 1、修...

• 100 Days of SwiftUI —— Day 36：iExpense（一）

有人问到开源Linux操作系统的创建者林纳斯·托瓦兹(Linus Torvalds)是否对想要构建大型软件项目的开发人员有任何建议。这是他给的答复：

• js 六种数据类型的区别及bool 转换判断

一、bool型转换判断： 1、true 和 1 比较是相同，false 和 0 比较是相同（是 “==” 比较），因为内部会实现数据类型的 转化，将true 转...

• 学习心得：C语言实现链表的操作超详细

今天将给大家讲述链表的学习心得。学习数据结构，毋庸置疑链表必须学好，后面的栈、队列、树、图都是以链表为基础的；链表的种类很多，有单链表、双链表、循环链表、非循环...

• 下季度才开卖的英伟达V100，就这么送给了15家研究机构

李林 假装发自 Honolulu 量子位 报道 | 公众号 QbitAI ? 英伟达重磅新核弹Tesla V100发布已有两个多月，它的实体终于亮相了。 在正在...