2016-09-16 43 views
3

我需要在火花中實現滯後函數;這是我能夠做到像下面 (從蜂巢/ TEMP火花表中的一些數據)帶參數爲動態的火花滯後函數

說出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")))); 

這意味着,如果硬編碼滯後值沒有,它工作正常。

然而,如果我通過了滯後值作爲參數它不工作:

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")))); 

我需要類型轉換山坳類型的參數爲整數?

回答

3

這是不可能的。窗口函數使用不能動態修改的固定大小的框架。您可以計算lag1..3,然後選擇當前行所需的一個。

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

@ LostlnOverflow..yeah ..我做了與案件..since我lagno同樣期待50多個這樣我可能會寫50個conditions..Is有什麼辦法可以一有UDF其應採取lgno col的值,並返回整數..但我是暫定的,如果這是可能的。 – kre