Spark 2.0 groupBy 列,然后在 datetype 列上获取 max(date)
Posted
技术标签:
【中文标题】Spark 2.0 groupBy 列,然后在 datetype 列上获取 max(date)【英文标题】:Spark 2.0 groupBy column and then get max(date) on a datetype column 【发布时间】:2016-09-26 09:43:52 【问题描述】:我在 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 并仅获取具有“最后”日期(最近的日期)的行。 “日期”列的类型是日期。
在我的情况下,结果是
------+----------------+
ID| max(date)|
------+----------------+
981200| 2010-12-30|
968800| 2010-12-31|
966500| 2010-12-01|
我试过了
Dataset<Row> df = old_df.groupBy("ID").max("date");
但因错误而失败
线程“主”org.apache.spark.sql.AnalysisException 中的异常: “日期”不是数字列。 聚合函数只能应用于数值列。;
有没有办法在 Spark 中获取最大日期(使用日期类型)?
提前致谢。
【问题讨论】:
【参考方案1】:RelationalGroupedDataset.max
仅用于数值。
您可以尝试 agg()
附带的 max
函数。在 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"))
【讨论】:
【参考方案2】:此解决方法在 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 看起来多么不成熟!不会以任何方式削弱其所有大数据功能!
【讨论】:
以上是关于Spark 2.0 groupBy 列,然后在 datetype 列上获取 max(date)的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark 2.0 中访问向量列时出现 MatchError
如何在 spark sql 2.1.0 中的 Dataset<Row> 上获取 groupby 之后的所有列