如何在Apache Spark中对两个单独的数据帧执行算术运算?

时间:2017-09-01 16:01:52

标签: scala apache-spark apache-spark-sql

我有两个如下数据帧,每个数据帧只有一行和一列。两者都有两个不同的数值。

如何对这两个数据帧值执行或实现除法或其他算术运算?

请帮忙。

2 个答案:

答案 0 :(得分:1)

首先,如果这些DataFrame每个都包含单个记录 - 任何进一步使用Spark都可能会浪费(Spark适用于大型数据集,小型数据集将在本地处理得更快)。因此,您可以使用first()从那里继续收集这些单记录值:

import spark.implicits._

val df1 = Seq(2.0).toDF("col1")
val df2 = Seq(3.5).toDF("col2")

val v1: Double = df1.first().getAs[Double](0)
val v2: Double = df2.first().getAs[Double](0)

val sum = v1 + v2

如果出于某种原因,您确实想要一直使用DataFrame,可以使用crossJoin将记录连接在一起,然后应用任何算术运算:

import spark.implicits._

val df1 = Seq(2.0).toDF("col1")
val df2 = Seq(3.5).toDF("col2")

df1.crossJoin(df2)
  .select($"col1" + $"col2" as "sum")
  .show() 

// +---+
// |sum|
// +---+
// |5.5|
// +---+

答案 1 :(得分:0)

如果您将数据框设为

scala> df1.show(false)
+------+
|value1|
+------+
|2     |
+------+

scala> df2.show(false)
+------+
|value2|
+------+
|2     |
+------+

您可以通过执行以下操作获取值

scala> df1.take(1)(0)(0)
res3: Any = 2

但是dataType是Any,在我们进行算术运算之前需要进行类型转换

scala> df1.take(1)(0)(0).asInstanceOf[Int]*df2.take(1)(0)(0).asInstanceOf[Int]
res8: Int = 4