Spark 2.0 groupBy列,然后在datetype列上获取max(date)

erc*_*ran 1 java apache-spark apache-spark-sql

我在Java中使用Spark 2.0。我有一个数据集,看起来像这样:

------+----+----+----+----------------+
    ID|col1|col2|col3|            date|
------+----+----+----+----------------+
981200| a  | q  | z  |      2010-12-30|
968800| s  | w  | x  |      2010-12-31|
966500| d  | e  | c  |      2010-11-02|
966500| f  | r  | v  |      2010-12-01|
981200| g  | t  | b  |      2010-12-03|
Run Code Online (Sandbox Code Playgroud)

我想对ID进行分组并仅获取具有“最后”日期(最近的日期)的行。“日期”列的类型为date

就我而言,结果是

------+----------------+
    ID|       max(date)|
------+----------------+
981200|      2010-12-30|
968800|      2010-12-31|
966500|      2010-12-01|
Run Code Online (Sandbox Code Playgroud)

我试过了

    Dataset<Row> df = old_df.groupBy("ID").max("date");
Run Code Online (Sandbox Code Playgroud)

但由于错误而失败

线程“主”中的异常org.apache.spark.sql.AnalysisException:“日期”不是数字列。聚合功能只能应用于数字列。

有没有一种方法可以获取Spark中的最大日期(使用日期类型)?

提前致谢。

Ber*_*ium 5

RelationalGroupedDataset.max 仅适用于数值。

您可以尝试agg()使用附带的max功能。在Scala中:

import org.apache.spark.sql.functions._
old_df.groupBy($"ID").agg(max("date"))
Run Code Online (Sandbox Code Playgroud)

因此在Java中应该是:

import static org.apache.spark.sql.functions.*;
old_df.groupBy("ID").agg(max("date"))
Run Code Online (Sandbox Code Playgroud)