我希望获得每种产品的最大和最小库存,并计算这些值之间的差异。如果股票等于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?
答案 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)))