Window
関数は部分的なトリックだけを行う必要があります。他の部分的なトリックはudf
機能
def div = udf((age: Double, lag: Double) => lag/age)
ファーストを定義することによって行うことができ、我々はlag
はWindow
機能を使用して検索し、div
輸入sqlContext.implicits._ を見つけるために、udf
機能でそのlag
とage
を渡す必要があります輸入org.apache.spark.sql.functions._
val dataframe = Seq(
("A",100),
("A",50),
("A",20),
("A",4)
).toDF("person", "Age")
val windowSpec = Window.partitionBy("person").orderBy(col("Age").desc)
val newDF = dataframe.withColumn("lag", lag(dataframe("Age"), 1) over(windowSpec))
そして最後には、UDFの機能をCAL
newDF.filter(newDF("lag").isNotNull).withColumn("div", div(newDF("Age"), newDF("lag"))).drop("Age", "lag").show
最終的な出力は次のようになり
+------+---+
|person|div|
+------+---+
| A|2.0|
| A|2.5|
| A|5.0|
+------+---+
@Jacekとして ではなく.filter(newDF("lag").isNotNull)
の.na.drop
を使用して/
演算子を使用するために、よりよい解決策を提案しているので、私たちも、呼び出す必要はありません編集udf
機能
newDF.na.drop.withColumn("div", newDF("lag")/newDF("Age")).drop("Age", "lag").show
はい。それはウィンドウ集合関数の "仕事"です。 '/'を使いましたか? –
@JacekLaskowski、 '/'または 'functions'に似たものは見つかりませんでした。 – summerbulb