第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何選擇每組的第一行?

如何選擇每組的第一行?

慕尼黑5688855 2019-06-01 13:39:48
如何選擇每組的第一行?我生成了一個DataFrame,如下所示:df.groupBy($"Hour", $"Category")   .agg(sum($"value") as "TotalValue")   .sort($"Hour".asc, $"TotalValue".desc))結(jié)果如下:+----+--------+----------+ |Hour|Category|TotalValue| +----+--------+----------+ |   0|   cat26|      30.9| |   0|   cat13|      22.1| |   0|   cat95|      19.6| |   0|  cat105|       1.3| |   1|   cat67|      28.5| |   1|    cat4|      26.8| |   1|   cat13|      12.6| |   1|   cat23|       5.3| |   2|   cat56|      39.6| |   2|   cat40|      29.7| |   2|  cat187|      27.9| |   2|   cat68|       9.8| |   3|    cat8|      35.6| | ...|    ....|      ....| +----+--------+----------+如您所見,DataFrame是由Hour以一個越來越大的順序,然后.TotalValue按降序排列。我想選擇每一組的頂部行,即從組h=0選擇(0,cat26,30.9)從小時組=1選擇(1,cat67,28.5)從小時組=2選擇(2,cat 56,39.6)諸若此類因此,期望的輸出是:+----+--------+----------+ |Hour|Category|TotalValue| +----+--------+----------+ |   0|   cat26|      30.9| |   1|   cat67|      28.5| |   2|   cat56|      39.6| |   3|    cat8|      35.6| | ...|     ...|       ...| +----+--------+----------+也可以方便地選擇每個組的前N行。任何幫助都是非常感謝的。
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗 獲得超4個贊

對于星火2.0.2,按多列分組:


import org.apache.spark.sql.functions.row_number

import org.apache.spark.sql.expressions.Window


val w = Window.partitionBy($"col1", $"col2", $"col3").orderBy($"timestamp".desc)


val refined_df = df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop("rn")


查看完整回答
反對 回復(fù) 2019-06-01
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗 獲得超4個贊

這和零323回答而是以SQL查詢的方式。

假設(shè)創(chuàng)建了dataframe并將其注冊為

假設(shè)創(chuàng)建了dataframe并將其注冊為


df.createOrReplaceTempView("table")

//+----+--------+----------+

//|Hour|Category|TotalValue|

//+----+--------+----------+

//|0   |cat26   |30.9      |

//|0   |cat13   |22.1      |

//|0   |cat95   |19.6      |

//|0   |cat105  |1.3       |

//|1   |cat67   |28.5      |

//|1   |cat4    |26.8      |

//|1   |cat13   |12.6      |

//|1   |cat23   |5.3       |

//|2   |cat56   |39.6      |

//|2   |cat40   |29.7      |

//|2   |cat187  |27.9      |

//|2   |cat68   |9.8       |

//|3   |cat8    |35.6      |

//+----+--------+----------+

窗口功能:


sqlContext.sql("select Hour, Category, TotalValue from (select *, row_number() OVER (PARTITION BY Hour ORDER BY TotalValue DESC) as rn  FROM table) tmp where rn = 1").show(false)

//+----+--------+----------+

//|Hour|Category|TotalValue|

//+----+--------+----------+

//|1   |cat67   |28.5      |

//|3   |cat8    |35.6      |

//|2   |cat56   |39.6      |

//|0   |cat26   |30.9      |

//+----+--------+----------+

普通SQL聚合,后面是聯(lián)接:


sqlContext.sql("select Hour, first(Category) as Category, first(TotalValue) as TotalValue from " +

  "(select Hour, Category, TotalValue from table tmp1 " +

  "join " +

  "(select Hour as max_hour, max(TotalValue) as max_value from table group by Hour) tmp2 " +

  "on " +

  "tmp1.Hour = tmp2.max_hour and tmp1.TotalValue = tmp2.max_value) tmp3 " +

  "group by tmp3.Hour")

  .show(false)

//+----+--------+----------+

//|Hour|Category|TotalValue|

//+----+--------+----------+

//|1   |cat67   |28.5      |

//|3   |cat8    |35.6      |

//|2   |cat56   |39.6      |

//|0   |cat26   |30.9      |

//+----+--------+----------+

使用對結(jié)構(gòu)的排序:


sqlContext.sql("select Hour, vs.Category, vs.TotalValue from (select Hour, max(struct(TotalValue, Category)) as vs from table group by Hour)").show(false)

//+----+--------+----------+

//|Hour|Category|TotalValue|

//+----+--------+----------+

//|1   |cat67   |28.5      |

//|3   |cat8    |35.6      |

//|2   |cat56   |39.6      |

//|0   |cat26   |30.9      |

//+----+--------+----------+

數(shù)據(jù)集方法和別這樣S與原答案相同。


查看完整回答
反對 回復(fù) 2019-06-01
  • 3 回答
  • 0 關(guān)注
  • 654 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號