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

时间:2016-09-26 09:43:53

标签: 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|

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

在我的情况下,结果将是

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

我试过

    Dataset<Row> df = old_df.groupBy("ID").max("date");

但失败并出现错误

  

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

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

RelationalGroupedDataset.max仅用于数值。

您可以使用随附的agg()功能尝试max。在斯卡拉:

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"))

答案 1 :(得分:0)

此替代方法在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")

所以:

  • 转换为字符串
  • 转换为整数
  • 获得最大价值
  • 转换为字符串
  • 转换回日期

另请参阅PySpark groupby and max value selection

旁注:啊,记住它在SQL中多么容易和快捷! Scala似乎还不成熟!绝不以任何方式削弱其所有大数据功能!