Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多列groupBy并从每个组中获取最大值(Java Spark)_Java_Apache Spark_Max - Fatal编程技术网

多列groupBy并从每个组中获取最大值(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,但是这个和其他示例只在一列上分组,而这里我在三列上分组 如果可能的话,

我在Java Spark中有一个与城市出租车相关的“数据集”,在它的几个专栏中,它有:

  • 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();