pyspark: dataframe的groupBy用法

最近用到dataframe的groupBy有點多藏斩,所以做個小總結(jié)片择,主要是一些與groupBy一起使用的一些聚合函數(shù),如mean拴疤、sum永部、collect_list等;聚合后對新列重命名呐矾。

大綱

  1. groupBy以及列名重命名
  2. 相關(guān)聚合函數(shù)

1. groupBy

from pyspark.sql import Row
rdd = sc.parallelize([Row(name='Alice', level='a', age=5, height=80),Row(name='Bob', level='a', age=5, height=80),Row(name='Cycy', level='b', age=10, height=80),Row(name='Didi', level='b', age=12, height=75),Row(name='EiEi', level='b', age=10, height=70)])
df = rdd.toDF()
#df.select(['name','level']).show()
print df.columns
#['age', 'height', 'level', 'name']
print df.dtypes
#[('age', 'bigint'), ('height', 'bigint'), ('level', 'string'), ('name', 'string')]

1.1 使用{}進行聚合操作

單列聚合
# 按level分組苔埋,計算age的平均值
_df1 = df.groupBy('level').agg({"age":"mean", "height": "mean"})
print _df1.show()
"""
+-----+------------------+-----------+
|level|          avg(age)|avg(height)|
+-----+------------------+-----------+
|    b|10.666666666666666|       75.0|
|    a|               5.0|       80.0|
+-----+------------------+-----------+
"""
多列聚合
_df2 = df.groupBy('level','age').agg({"height":"mean"})
#下面用[]的寫法是對的
#_df2 = df.groupBy(['level','age']).agg({"height":"mean"}) 
#用()的寫法報錯
#_df2 = df.groupBy(('level','age')).agg({"height":"mean"}) 
print _df2.show()
"""
+-----+---+-----------+
|level|age|avg(height)|
+-----+---+-----------+
|    a|  5|       80.0|
|    b| 10|       75.0|
|    b| 12|       75.0|
+-----+---+-----------+
"""
重命名

這種方式下聚合后重命名,可以使用dataframe的withColumnRenamed函數(shù)蜒犯。以多列聚合的case為例组橄。

_df = _df2.withColumnRenamed('avg(height)', 'mean_height')
print _df.show()
"""
+-----+---+-----------+
|level|age|mean_height|
+-----+---+-----------+
|    a|  5|       80.0|
|    b| 10|       75.0|
|    b| 12|       75.0|
+-----+---+-----------+
"""

1.2 使用pyspark.sql.functions的函數(shù)聚合、重命名

這種方式使用更簡潔愧薛。

from pyspark.sql import functions as sf
_df3 = df.groupBy('level').agg(sf.mean(df.age).alias('mean_age'),sf.mean(df.height).alias('mean_height'))
#_df3 = df.groupBy('level').agg(sf.mean(df["age"]).alias('mean_age'),sf.mean(df["height"]).alias('mean_height'))
print _df3.show()
"""
+-----+------------------+-----------+
|level|          mean_age|mean_height|
+-----+------------------+-----------+
|    b|10.666666666666666|       75.0|
|    a|               5.0|       80.0|
+-----+------------------+-----------+
"""

2.相關(guān)聚合函數(shù)

具體函數(shù)可見pyspark.sql.functions晨炕;我看了一遍,比較齊全毫炉,基本hive的用法都可以支持瓮栗。下面列舉一些我最近常用的函數(shù)。

'max': 'Aggregate function: returns the maximum value of the expression in a group.',
'min': 'Aggregate function: returns the minimum value of the expression in a group.',
'count': 'Aggregate function: returns the number of items in a group.',

'sum': 'Aggregate function: returns the sum of all values in the expression.',
'avg': 'Aggregate function: returns the average of the values in a group.',
'mean': 'Aggregate function: returns the average of the values in a group.',
'sumDistinct': 'Aggregate function: returns the sum of distinct values in the expression.'
'collect_list': returns a list of objects with duplicates.
'collect_set': returns a set of objects with duplicate elements eliminated.
'stddev': 'Aggregate function: alias for stddev_samp.',
'variance': 'Aggregate function: alias for var_samp.'

下面介紹sumDistinct、collect_list费奸、collect_set

sumDistinct 去重后求和
df.groupBy('level').agg(sf.mean(df.age).alias('mean_age'),sf.sumDistinct(df.height).alias('sum_height'))
"""
+-----+------------------+----------+                                           
|level|          mean_age|sum_height|
+-----+------------------+----------+
|    b|10.666666666666666|       225|
|    a|               5.0|        80|
+-----+------------------+----------+
"""
collect_list

pyspark.sql.functions 還可以嵌套使用, collect_set返回去重后的結(jié)果弥激,用法同collect_list

print df.groupBy('level').agg(sf.collect_list(df.name)).show()
"""
+-----+------------------+                                                      
|level|collect_list(name)|
+-----+------------------+
|    b|[Didi, EiEi, Cycy]|
|    a|      [Alice, Bob]|
+-----+------------------+
"""
# concat_ws拼接字符串類型的array
print df.groupBy('level').agg(sf.concat_ws(',', sf.collect_list(df.name))).show()
"""
+-----+--------------------------------+
|level|concat_ws(,, collect_list(name))|
+-----+--------------------------------+
|    b|                  Cycy,Didi,EiEi|
|    a|                       Alice,Bob|
+-----+--------------------------------+
"""
print df.groupBy('level').agg(sf.concat_ws(',', sf.collect_list(df.name)).alias("names")).show()
"""
+-----+--------------+                                                          
|level|         names|
+-----+--------------+
|    b|Cycy,Didi,EiEi|
|    a|     Alice,Bob|
+-----+--------------+
"""
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愿阐,隨后出現(xiàn)的幾起案子微服,更是在濱河造成了極大的恐慌,老刑警劉巖缨历,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件以蕴,死亡現(xiàn)場離奇詭異,居然都是意外死亡辛孵,警方通過查閱死者的電腦和手機丛肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魄缚,“玉大人宝与,你說我怎么就攤上這事∫逼ィ” “怎么了习劫?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚼隘。 經(jīng)常有香客問我诽里,道長,這世上最難降的妖魔是什么嗓蘑? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任须肆,我火速辦了婚禮匿乃,結(jié)果婚禮上桩皿,老公的妹妹穿的比我還像新娘。我一直安慰自己幢炸,他們只是感情好泄隔,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宛徊,像睡著了一般佛嬉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闸天,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天暖呕,我揣著相機與錄音,去河邊找鬼苞氮。 笑死湾揽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播库物,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼霸旗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戚揭?” 一聲冷哼從身側(cè)響起诱告,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎民晒,沒想到半個月后精居,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡潜必,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年箱蟆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刮便。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡空猜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恨旱,到底是詐尸還是另有隱情辈毯,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布搜贤,位于F島的核電站谆沃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仪芒。R本人自食惡果不足惜唁影,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掂名。 院中可真熱鬧据沈,春花似錦、人聲如沸饺蔑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猾警。三九已至孔祸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間发皿,已是汗流浹背崔慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穴墅,地道東北人惶室。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓匣屡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拇涤。 傳聞我的和親對象是個殘疾皇子捣作,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,464評論 0 13
  • http://spark.apache.org/docs/latest/api/python/index.html...
    mpro閱讀 6,098評論 0 4
  • 類 pyspark.RDD A Resilient Distributed Dataset (RDD), the ...
    NEO_X閱讀 992評論 0 1
  • 2018年12月29日的清晨,當我拉開窗簾的一瞬間鹅士,眼前一片雪白的顏色券躁,哇塞!我們貴陽下雪了掉盅! 在貴陽的冬季也拜,真難...
    青木流泉閱讀 1,017評論 0 2
  • 1 老公這幾天有事情得到外地一趟。以前每次都是他一個人孤獨的走趾痘,我連去送他的機會都沒有慢哈。趁這幾天單位不是很忙,于是...
    幸福的西瓜君閱讀 519評論 2 1