Javaのスパークと以前のバージョンに依存スパークデータセット内の値を計算します

ジャック:

私は、このデータセットを持っています:

ID      timestamp   value
unique1 1584420000  120
unique1 1584410000  100
unique1 1584400000  20
unique2 1584410000  90
unique2 1584400000  10
unique3 1584400000  30

私は、同じIDの以前のバージョンに依存IDとバージョンの値を計算する必要があります。IDは、前の最後のバージョンを持っていない場合は、値が同じに保たれています

ID      timestamp   valueCalculated
unique1 1584420000  20
unique1 1584410000  80
unique1 1584400000  20
unique2 1584410000  80
unique2 1584400000  10
unique3 1584400000  30

IDごとに1つだけの行を与える(IDが更新されていない場合、それはその値を保持します)私はこれを達成しようとしたが、私は唯一のIDとバージョンによって集約し、最後の二つのバージョンのavaibleのマイナスを行うことができると思います。

ID      timestamp   valueCalculated
unique1 1584420000  20
unique2 1584410000  80
unique3 1584400000  30

この私のコード:

dataset.groupBy("id","timestamp")
.agg(
max("timestamp").as("timestamp"),
functionscallUDF("CalculateValue",first("timestamp"),first("value"),last("timestamp"),last("value")
).as("valueCalculated")

私は期待値を計算するためにUDF4を使用しています:

sparksession.udf().register("CalculatValue", (UDF4<Long,Double,Long,Double,Double>) this::calculateValue , DataTypes.DoubleType);

public Double calculateValue(Long Version1, Double Value1,Long Version2, Double Value2){
if(version1.equals(version2)){
return value1;
}else{
return value1 - value2;
}
}

私は私が凝集のbecaureここで良いのアプローチを使用していないと思います。あなたはこれを達成するために助けを喜ばせるだろうか?感謝

Lamanus:

私は、バージョンが何であるかを理解していないが、あなたは、このように現在の行と前の行の間の値の差異を計算することができます。

import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy("ID").orderBy("timestamp")
df.withColumn("previousValue", lag($"value", 1, 0).over(w))
  .withColumn("valueCalculated", $"value" - $"previousValue")
  .orderBy("ID", "timestamp")
  .show(false)

これは次のようにあなたの結果が得られます。

+-------+----------+-----+-------------+---------------+
|ID     |timestamp |value|previousValue|valueCalculated|
+-------+----------+-----+-------------+---------------+
|unique1|1584400000|20   |0            |20             |
|unique1|1584410000|100  |20           |80             |
|unique1|1584420000|120  |100          |20             |
|unique2|1584400000|10   |0            |10             |
|unique2|1584410000|90   |10           |80             |
|unique3|1584400000|30   |0            |30             |
+-------+----------+-----+-------------+---------------+

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=296929&siteId=1