【问题标题】:Spark 2.0 groupBy column and then get max(date) on a datetype columnSpark 2.0 groupBy 列,然后在 datetype 列上获取 max(date)
【发布时间】: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 中获取最大日期(使用日期类型)?

提前致谢。

【问题讨论】:

    标签: java apache-spark apache-spark-sql


    【解决方案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 看起来多么不成熟!不会以任何方式削弱其所有大数据功能!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        相关资源
        最近更新 更多