pyspark返回每个分组某个值最大的行

  统计/机器学习 Python sql    浏览次数:287        分享
0

我现在一个hive表里有type,value,id等等好几列,我想返回type每个分组里value最大的行。

不能用groupby max,因为这样只能返回每个分组的最大值,而不是完整的行。我用pyspark应该怎么做呢?

 

ziyu   2020-04-15 23:39



   1个回答 
3

这种用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面经

wwb_306   2020-04-16 18:36

谢谢 - ziyu   2020-04-17 09:17


  相关主题

spark里怎么refresh表?   3回答

pyspark里如何进行SELECT DISTINCT操作?   1回答

pyspark里怎么把一列日期转成是全年的第几周?   2回答

pyspark里怎么把类似‘yyyy-mm-dd‘的字符串转成星期几的形式?   1回答

如何获取pyspark DataFrame的行数和列数?   1回答

怎么在pyspark里把dataframe写入csv文件?   1回答

怎么将两个pyspark dataframe以串联的形式合并?   1回答

怎么对pyspark dataframe里的空缺值填值?   1回答

spark sql里怎么用case when?   1回答

怎么对pyspark.sql.dataframe按照某一列降序排列?   1回答

spark ml和spark mllib区别   5回答

pyspark dataframe的collect()方法是什么意思?   2回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!