Java Spark 2.0 groupBy列,然后获取datetype列的最大值(日期)

Java Spark 2.0 groupBy列,然后获取datetype列的最大值(日期),java,apache-spark,apache-spark-sql,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

我正在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|
我想转到groupBy ID,只获取带有“last”日期(最近一个)的行。列“date”的类型为date

在我的情况下,结果将是

------+----------------+
    ID|       max(date)|
------+----------------+
981200|      2010-12-30|
968800|      2010-12-31|
966500|      2010-12-01|
我试过了

    Dataset<Row> df = old_df.groupBy("ID").max("date");
Dataset df=old_df.groupBy(“ID”).max(“日期”);
但由于错误而失败

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

有没有办法在Spark中获取最大日期(使用类型日期)


提前感谢。

RelationalGroupedDataset.max
仅用于数值

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

import org.apache.spark.sql.functions._
old_df.groupBy($"ID").agg(max("date"))
因此,在Java中,它应该是:

import static org.apache.spark.sql.functions.*;
old_df.groupBy("ID").agg(max("date"))

这个变通方法显示了我在PySpark的Palantir(Scala环境)中的结果:

def get_max_from_date(country_ref):
    return country_ref\
        .selectExpr("cast(date_format(from_date, 'YYYYMMDD') as decimal(8,0)) as c")\
        .agg(F.max('c').alias('max_c'))\
        .selectExpr("cast(max_c as varchar(8)) as max_c_string")\
        .select(F.to_date(F.col('max_c_string'), 'YYYYMMDD')).alias("max_from_date")
因此:

  • 转换为字符串
  • 转换为整数
  • 获得最大值
  • 转换为字符串
  • 转换回最新版本
另见

旁注:啊,记住在SQL中是多么简单和快速!Scala看起来是多么不成熟啊!不会以任何方式削弱其所有大数据功能