2016-09-16 5 views
3

sparkでラグ関数を実装する必要があります。 (ハイブ/一時スパークテーブルからいくつかのデータを持つ)は私のような の下に行うことができましたパラメータを動的に設定したスパークラグ関数

DFは、これらの行を持って言う:

最初の列が希望の実際の遅れ番号です
lagno:value 
0, 100 
0, 200 
2, null 
3, null 

2番目の列は実際の値です。

私はそれが動作します。このクエリを実行すると:

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

私は整数にCOL型のパラメータをキャストタイプする必要がありますか?

答えて

3

これはできません。ウィンドウ関数は、動的に変更できない固定サイズのフレームを使用します。 1..3の場合はを計算し、現在の行に必要なものを選択できます。 LostlnOverflow..yeah @

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

が..私は50以上を期待している私のlagno ..since場合と同じことをやった私はそこに取るものとするUDFを持つことができます任意の方法を50 conditions..Isを書き終わるかもしれませんlgno colの値と整数を返しますが、これが可能な場合は暫定的です。 – kre

関連する問題