如何获得每种产品的最小和最大库存之间的差异?

时间:2017-11-20 09:58:53

标签: scala apache-spark dataframe

我希望获得每种产品的最大和最小库存,并计算这些值之间的差异。如果股票等于null或为空,则应将其替换为0。

这是我的代码:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._

val windowSpec = Window.partitionBy("product_pk")
val sales = df
             .select($"product_pk",$"stock")
             .withColumn("sold",max($"stock")-min($"stock").over(windowSpec))

但是当我运行代码时出现此错误。我不明白为什么我不能将Window用于product_pk

  

诊断:用户类抛出异常:   org.apache.spark.sql.AnalysisException:分组表达式序列   是空的,'mytable。product_pk'不是聚合函数。   在窗口函数中包裹'(max(mytable。stock)AS _w0)'或   如果不这样,请在first()(或first_value)中包装'mytable。product_pk'   关心你得到的价值。;;

或者我应该使用groupBy product_pk?

1 个答案:

答案 0 :(得分:0)

目前您在错误的上下文中使用max(未指定窗口),请尝试:

val sales = df
  .select($"product_pk",$"stock")
  .withColumn("sold",max($"stock").over(windowSpec)-min($"stock").over(windowSpec))

您也可以使用groupBy:

val sales = df
  .groupBy($"product_pk",$"stock")
    .agg(
      max($"stock").as("max_stock"),
      min($"stock").as("min_stock")
    )
  .withColumn("sold",coalesce($"max_stock"-$"min_stock",lit(0.0)))