我现在一个hive表里有type,value,id等等好几列,我想返回type每个分组里value最大的行。
不能用groupby max,因为这样只能返回每个分组的最大值,而不是完整的行。我用pyspark应该怎么做呢?
1个回答
这种用reducebykey就可以了
from pyspark.sql import functions as F
from pyspark.sql.window import Window
df = sql_context.createDataFrame([
("A", "ARON", 1),
("A", "BILL", 2),
("A", "CLAIR", 3),
("B", "DANIEL", 1),
("B", "ERIC", 4),
("B", "FRANK", 2),
], ["id", "name", "weight"])
def max_row(row1,row2):
if row1['weight'] > row2['weight']:
return row1
else:
return row2
df_rdd = df.rdd.map(lambda row: (row['id'], row)).\
reduceByKey(lambda row1,row2: max_row(row1,row2)).map(lambda row: row[1])
sql_context.createDataFrame(df_rdd).show()
或者用分组排序后取第一个
windows_spec = Window.partitionBy("id").orderBy(F.col("weight").desc())
max_df = df.withColumn("rank", F.rank().over(windows_spec)).filter("rank =1")
max_df.show()
可能第一个会快一些吧,一般也都是用第一个
SofaSofa数据科学社区DS面试题库 DS面经
谢谢
-
ziyu
2020-04-17 09:17