多列groupBy并从每个组中获取最大值(Java Spark)
我在Java Spark中有一个与城市出租车相关的“数据集”,在它的几个专栏中,它有:多列groupBy并从每个组中获取最大值(Java Spark),java,apache-spark,max,Java,Apache Spark,Max,我在Java Spark中有一个与城市出租车相关的“数据集”,在它的几个专栏中,它有: day格式为2016-04-02,即出租车接送客户的当天 vendor\u id,例如1 hour格式为2或16 我想知道每个供应商每天拥有最多客户的时间。所以,我想我应该在这三个栏目中加入GroupBy。我在GroupBy之后得到的是 : 如何获得每个供应商(由GroupBy创建的组)每天的小时数以及最大计数 我已经看到这是join,但是这个和其他示例只在一列上分组,而这里我在三列上分组 如果可能的话,
格式为day
,即出租车接送客户的当天2016-04-02
,例如vendor\u id
1
格式为hour
或2
16
GroupBy
。我在GroupBy
之后得到的是
:
如何获得每个供应商(由GroupBy
创建的组)每天的小时数以及最大计数
我已经看到这是join,但是这个和其他示例只在一列上分组,而这里我在三列上分组
如果可能的话,我更喜欢使用Spark库的Java代码,谢谢您的时间。La Tex,根据我的理解,这是一个解决问题的Java代码示例。在这里,我们为每个供应商/天保留一行。我添加了一个额外的过滤器,以便在多行的计数仍然相同时保留第一行(基于小时):
WindowSpec window = Window.partitionBy("vendor_id", "day");
Dataset<Row> withMaxDF = df.withColumn("maxCount", org.apache.spark.sql.functions.max(org.apache.spark.sql.functions.col("count")).over(window))
.where("count = maxCount")
.withColumn("rnum",org.apache.spark.sql.functions.row_number().over(window.orderBy("hour")))
.where("rnum = 1")
.drop("maxCount", "rnum");
withMaxDF.show();
我按照@Salim的建议使用了
Window
类,它起了作用。事实上,我已经看到了用窗口可以解决这个问题,但我认为使用join
会更容易
Dataset<Row> df_dhv_grouped = df.groupBy(
col("day"), col("vendor_id"), col("hour")).count();
Dataset<Row> df_max_hours =df_dhv_grouped.withColumn("max_drives_hour",max("count")
.over(Window.partitionBy("day","vendor_id")));
df_max_hours.filter(col("count").equalTo(col("max_drives_hour")))
.orderBy(col("day").asc(), col("vendor_id").asc()).show();
Dataset df_dhv_group=df.groupBy(
col(“日”)、col(“供应商id”)、col(“小时”)。计数();
数据集df_max_hours=df_dhv_分组。带列(“max_drives_hours”,max(“count”)
.over(Window.partitionBy(“日期”,“供应商id”));
df_max_hours.filter(col(“count”).equalTo(col(“max_hours”))
.orderBy(col(“day”).asc(),col(“供应商id”).asc()).show();
谢谢您的回答。窗口功能可能有助于Hi@La Tex,您能分享一个完整的数据样本和预期结果吗?
+-----+----------+----+---------+
|count| day|hour|vendor_id|
+-----+----------+----+---------+
| 116|2016-01-01| 2| 1|
+-----+----------+----+---------+
Dataset<Row> df_dhv_grouped = df.groupBy(
col("day"), col("vendor_id"), col("hour")).count();
Dataset<Row> df_max_hours =df_dhv_grouped.withColumn("max_drives_hour",max("count")
.over(Window.partitionBy("day","vendor_id")));
df_max_hours.filter(col("count").equalTo(col("max_drives_hour")))
.orderBy(col("day").asc(), col("vendor_id").asc()).show();