簡體   English   中英

比較Spark中當前行和上一行的值

[英]Compare Value of Current and Previous Row in Spark

我正在嘗試比較下面DataFrame中當前行和上一行的DataFrame 我要計算“金額”列。

scala> val dataset = sc.parallelize(Seq((1, 123, 50), (2, 456, 30), (3, 456, 70), (4, 789, 80))).toDF("SL_NO","ID","AMOUNT")

scala> dataset.show
+-----+---+------+
|SL_NO| ID|AMOUNT|
+-----+---+------+
|    1|123|    50|
|    2|456|    30|
|    3|456|    70|
|    4|789|    80|
+-----+---+------+

計算邏輯:

  1. 對於第1行,AMOUNT應該從第一行開始為50。
  2. 對於第2行,如果SL_NO-2和1的ID不相同,則需要考慮SL_NO-2的AMOUNT(即-30)。 否則為SL_NO的AMOUNT-1(即-50)
  3. 對於第3行,如果SL_NO-3和2的ID不相同,則需要考慮SL_NO-3的AMOUNT(即-70)。 否則為SL_NO的AMOUNT-2(即-30)

其他行也需要遵循相同的邏輯。

預期產量:

+-----+---+------+
|SL_NO| ID|AMOUNT|
+-----+---+------+
|    1|123|    50|
|    2|456|    30|
|    3|456|    30|
|    4|789|    80|
+-----+---+------+

請幫忙。

您可以在when.otherwise使用lag ,這是一個演示:

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

val w = Window.orderBy($"SL_NO")
dataset.withColumn("AMOUNT", 
    when($"ID" === lag($"ID", 1).over(w), lag($"AMOUNT", 1).over(w)).otherwise($"AMOUNT")
).show

+-----+---+------+
|SL_NO| ID|AMOUNT|
+-----+---+------+
|    1|123|    50|
|    2|456|    30|
|    3|456|    30|
|    4|789|    80|
+-----+---+------+

注意:由於此示例不使用任何分區,因此在實際數據中可能會出現性能問題,如果可以通過某些變量對問題進行分區Window.orderBy($"SL_NO").partitionBy($"ID")具體取決於您的實際問題以及ID是否一起排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM