ジャック:
私は、このデータセットを持っています:
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 |
+-------+----------+-----+-------------+---------------+