Spark Java API中的两行之间的区别

时间:2018-07-09 00:04:44

标签: java scala apache-spark

我有一个Spark数据集:

+----------+-----+----+
|      Date|Value|Name|
+----------+-----+----+
|2013-02-08|14.75| AAL|
|2013-02-11|14.46| AAL|
|2013-02-12|19.27| AAL|
|2013-02-11|13.66| FIN|
|2013-02-12|16.99| FIN|
+----------+-----+----+

我要计算以下几天的差额:

+----------+-----+----+
|      Date| Diff|Name|
+----------+-----+----+
|2013-02-11| 0.29| AAL|
|2013-02-12| 4.81| AAL|
|2013-02-12| 3.33| FIN|
+----------+-----+----+

我认为在here中提到的Scala中可以轻松实现。用Java有办法吗?

我正在尝试类似的方法,但这对我来说真的没有意义:

WindowSpec windowSpec = Window.partitionBy("Name").orderBy("Date");

modifiedDF = modifiedDF.withColumn("Diff", df.col("Value") - when((lag("Value", 1).over(windowSpec)).isNull(), 0).otherwise(lag("Value", 1).over(windowSpec)))
        .show(false);

Java抱怨减法运算符不能应用于“ org.apache.spark.sql.Column”类型。

但是,我确实看到在.divide()中实现了一个org.apache.spark.sql.functions方法,因此,以下工作正常:

modifiedDF = modifiedDF.withColumn("Diff", modifiedDF.col("Value").divide(when((lag("Value", 1).over(windowSpec)).isNull(), 0).otherwise(lag("Value", 1).over(windowSpec))));

我有两个问题:

1)这是正确的方法吗?

2)如果是,为什么在org.apache.spark.sql.functions中没有.subtract实现

1 个答案:

答案 0 :(得分:0)

我正在寻找的.subtract()函数名为.minus()

modifiedDF = modifiedDF.withColumn("Diff",
                modifiedDF.col("Value")
                        .minus(when((lag("Value", 1).over(windowSpec)).isNull(), 0)
                                .otherwise(lag("Value", 1).over(windowSpec))));

希望这对某人有帮助!