我必须在pyspark数据帧上进行2级分组。 我的暂定:
grouped_df=df.groupby(["A","B","C"])
grouped_df.groupby(["C"]).count()
但是我收到以下错误:
'GroupedData' object has no attribute 'groupby'
我想我应该首先将分组对象转换为pySpark DF。但我不能这样做。
有什么建议吗?
答案 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|
+---+-----+