PySpark之聚合函数

简介

PySpark在DataFrame API中定义了内置的标准聚合(Aggregate)函数,当我们需要对DataFrame的列进行聚合操作时候,这些函数就可以派上用场。聚合函数是对一系列行进行相应操作,然后返回对这些行进行相应操作后的单一计算结果,即这些函数返回的一般是一个值。
这些聚合函数一般接受以字符串形式的列类型或者列名称,以及一些函数特定的其他参数,并且它们的返回值是列的类型。

聚合函数列表

本文将介绍如下聚合函数:

  • approx_count_distinct
  • avg
  • collect_list
  • collect_set
  • countDistinct
  • count
  • first
  • last
  • kurtosis
  • max
  • min
  • mean
  • skewness
  • stddev
  • stddev_samp
  • stddev_pop
  • sum
  • sumDistinct
  • variance,var_samp, var_pop

我们先创建一个基本的DataFrame结构,后续所有的聚合操作都是针对此数据集的。

import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.functions import approx_count_distinct,collect_list
from pyspark.sql.functions import collect_set,sum,avg,max,countDistinct,count
from pyspark.sql.functions import first, last, kurtosis, min, mean, skewness 
from pyspark.sql.functions import stddev, stddev_samp, stddev_pop, sumDistinct
from pyspark.sql.functions import variance,var_samp,  var_pop

spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()

simpleData = [("James", "Sales", 3000),
    ("Michael", "Sales", 4600),
    ("Robert", "Sales", 4100),
    ("Maria", "Finance", 3000),
    ("James", "Sales", 3000),
    ("Scott", "Finance", 3300),
    ("Jen", "Finance", 3900),
    ("Jeff", "Marketing", 3000),
    ("Kumar", "Marketing", 2000),
    ("Saif", "Sales", 4100)
  ]
schema = ["employee_name", "department", "salary"]
  
df = spark.createDataFrame(data=simpleData, schema = schema)
df.printSchema()
df.show(truncate=False)

结果:

可以看到,数据主要有三列,分别是员工姓名,部门,薪资。

approx_count_distinct

approx_count_distinct()函数主要是用于计算一个组某一列中不同项目的计数值,这里的组你可以认为是很多列。
比如说我们要计算员工的薪资一共有多少种不同数据:

a = df.select(approx_count_distinct('salary')).collect()[0][0]
print("number of different salary: ",a)

结果:

同理,我们也可以看下员工一共来自多少个不同你部门:

a = df.select(approx_count_distinct('department')).collect()[0][0]
print("number of different salary: ",a)

输出:

avg (average)

avg()函数主要是用来计算某一列的平均值,比如我们计算所有员工的薪酬平均值:

print("average salary: ", str(df.select(avg("salary")).collect()[0][0]))

输出:

collect_list

collect_list()函数用于从输入列中返回全部的数值。下面的例子是返回"salary"列中所有的值

df.select(collect_list("salary")).show(truncate=False)

输出:

collect_set

collect_set()函数也是从输入列中返回全部不重复的值,还是以"salary"列为例:

df.select(collect_set("salary")).show(truncate=False)

输出:

countDistinct

countDistinct()函数用于计算某些列中不同元素的个数,比如这里返回所有行中"department"和"salary"这两列中元素至少有一个不相同的元素的个数:

df2 = df.select(countDistinct("department", "salary"))
df2.show(truncate=False)
print("Distinct Count of Department & Salary: "+str(df2.collect()[0][0]))

输出:

可能你还是没太明白,注意看下原始数据,其中有两个“James”的部门和薪资是一样的,还有"Robert"和"Saif"的部门和薪资也是一样的。故10个人里面,要去掉重复的2个,故最后结果是8。

count

count()用户返回指定的某一列中元素的个数,比如这里返回"salary"列中包含几个元素:

print("salary count: ", df.select(count("salary")).collect()[0])

输出:

first

first()函数用来返回指定列中的第一个元素,当”ignoreNulls“被设置成"True"的时候,它返回第一个非空的元素。

df.select(first("salary")).show(truncate=False)

输出:

last

last()函数用来返回指定列中的第一个元素,当”ignoreNulls“被设置成"True"的时候,它返回第一个非空的元素。

df.select(last("salary")).show(truncate=False)

输出:

kurtosis

kurtosis()函数用于返回一个组中的峰度。关于峰度的定义可参见维基百科

df.select(kurtosis("salary")).show(truncate=False)

输出:

max

max()函数主要返回一列中的最大值。

df.select(max("salary")).show(truncate=False)

结果:

min

min()函数主要返回一列中的最大值。

df.select(min("salary")).show(truncate=False)

输出:

mean

mean()函数主要返回某一列的平均值,也叫做Avg。

df.select(mean("salary")).show(truncate=False)

输出:

skewness

skewness()函数返回某一列的偏度,偏度的定义见百度百科

df.select(skewness("salary")).show(truncate=False)

输出:
image.png

stddev, stddev_samp and stddev_pop

stddev()和stddev_samp()是一样的, 返回某一列的样本标准偏差。
and stddev_pop()返回某一列中数据的总体标准偏差。

df.select(stddev("salary"), stddev_samp("salary"), \
    stddev_pop("salary")).show(truncate=False)

输出:

sum

sum() 函数返回某一列中全部值的总和。

df.select(sum("salary")).show(truncate=False)

输出:

sumDistinct

sumDistinct()函数返回列中所有不同值的总和。

df.select(sumDistinct("salary")).show(truncate=False)

输出:

variance, var_samp, var_pop

variance(), var_samp()是一样的,返回某一列中所有值的无偏方差。
var_pop()返回某一列中所有值的总体方差。

df.select(variance("salary"),var_samp("salary"),var_pop("salary")) \
  .show(truncate=False)

输出:

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容