火花滞后函数,参数为动态

时间:2016-09-16 00:09:26

标签: apache-spark apache-spark-sql

我需要在spark中实现lag函数;我能够像下面这样做 (来自hive / temp spark table的一些数据)

说DF有这些行:

lagno:value
0, 100
0, 200
2, null
3, null

其中第一列是您要使用的实际滞后数,第二列是实际值。

当我运行此查询时,它可以工作:

DataFrame df;
DataFrame dfnew=df.select(
            org.apache.spark.sql.functions.lag( df.col("value"), 1 ).over(org.apache.spark.sql.expressions.Window.orderBy(new1.col("value"))));

这意味着如果硬编码滞后的值为no,则可以正常工作。

但是,如果我将滞后值作为参数传递它不起作用:

DataFrame dfnew=df.select(
            org.apache.spark.sql.functions.lag( df.col("value"),df.col("lagno").over(org.apache.spark.sql.expressions.Window.orderBy(new1.col("value"))));

我是否需要将col类型的参数输入到整数?

1 个答案:

答案 0 :(得分:3)

这是不可能的。窗口函数使用无法动态修改的固定大小的帧。您可以为lag计算1..3,然后选择当前行所需的一个。

CASE 
  WHEN lagno = 1 THEN LAG(value,  1) OVER w 
  WHEN lagno = 2 THEN LAG(value,  2) OVER w 
  ...
  ELSE value
END