将pyspark groupedData对象转换为spark Dataframe

时间:2017-10-18 12:11:27

标签: pyspark-sql

我必须在pyspark数据帧上进行2级分组。 我的暂定:

grouped_df=df.groupby(["A","B","C"])
grouped_df.groupby(["C"]).count()

但是我收到以下错误:

'GroupedData' object has no attribute 'groupby'

我想我应该首先将分组对象转换为pySpark DF。但我不能这样做。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

我有同样的问题。我绕过它的方法是首先在第一个groupby之后执行“count()”,因为它返回一个Spark DataFrame,而不是GroupedData对象。然后你可以在返回的DataFrame上做另一个groupby。

所以试试:

import tkinter as tk
import random

# --- functions ---

def claim_field(x, y):
    buttons[(x,y)]['state'] = 'disabled'
    buttons[(x,y)]['bg'] = 'red'

# --- main ---

root = tk.Tk()

buttons = {}

for x in range(0, 7):
    for y in range(0, 7):
        btn = tk.Button(root, command=lambda a=x, b=y:claim_field(a,b))
        btn.grid(row=x, column=y)
        buttons[(x,y)] = btn

# disable random button        
x = random.randrange(0, 7)
y = random.randrange(0, 7)
claim_field(x, y)

root.mainloop()        

答案 1 :(得分:0)

https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.GroupedData

  

pyspark.sql.GroupedData聚合方法,由以下方法返回   DataFrame.groupBy()。

     

在DataFrame上聚合的一组方法,由   DataFrame.groupBy()。

您可以使用聚合函数,例如agg,avg,count,max,mean,min,pivot,sum,collect_list,collect_set,count,first,grouping等。

首先要注意:此功能是一项操作,如果您滥用此功能,它会使脚本变慢。

如果有数字列,则可以使用诸如min,max,mean等的聚集函数,但是如果您有字符串列,则可能要使用:

df.groupBy("ID").pivot("VAR").agg(concat_ws('', collect_list(col("VAL"))))

df.groupBy("ID").pivot("VAR").agg(collect_list(collect_list("VAL")[0]))

df.groupBy("ID").pivot("VAR").agg(first("VAL"))

答案 2 :(得分:0)

函数DataFrame.groupBy(cols)返回一个GroupedData对象。为了将GroupedData对象转换回DataFrame,您将需要使用GroupedData函数之一,例如mean(cols) avg(cols) count()。使用您的示例的示例是:

df = sqlContext.createDataFrame([['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']], schema=['A', 'B', 'C'])
df.show()

+---+---+---+
|  A|  B|  C|
+---+---+---+
|  a|  b|  c|
|  a|  b|  c|
|  a|  b|  c|
+---+---+---+

gdf = df.groupBy('C').count()
gdf.show()

+---+-----+
|  C|count|
+---+-----+
|  c|    3|
+---+-----+