我在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中获取最大日期(使用类型日期)?
提前致谢。
答案 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似乎还不成熟!绝不以任何方式削弱其所有大数据功能!