如何在 spark-sql 中对 scala 中的 Long 和 BigInt 执行数学运算



>我有两个不同类型的值,如下所示在 spark-sql 中所示

scala> val ageSum = df.agg(sum("age"))
ageSum: org.apache.spark.sql.DataFrame = [sum(age): bigint]
scala> val totalEntries = df.count();
scala> totalEntries
res37: Long = 45211

第一个值来自数据框上的聚合函数,第二个值来自数据框上的总计数函数。两者都有不同的类型,因为ageSum是bigInt,totalEntrys是Long。我想对它进行数学运算。平均值 = 年龄总和/总条目

scala> val mean = ageSum/totalEntries
<console>:31: error: value / is not a member of org.apache.spark.sql.DataFrame val mean = ageSum/totalEntries

我也尝试将ageSum转换为长类型,但无法这样做

scala> val ageSum = ageSum.longValue
<console>:29: error: recursive value ageSum needs type
val ageSum = ageSum.longValues

ageSum 是一个数据框,你需要从中提取值。一种选择是使用 first() 将值作为 Row获取,然后从行中提取值:

ageSum.first().getAs[Long](0)/totalEntries
// res6: Long = 2

如果需要更精确的值,可以使用toDouble在除法前进行转换:

ageSum.first().getAs[Long](0).toDouble/totalEntries
// res9: Double = 2.5

或者,您可以将结果设置为年龄总和的另一列:

ageSum.withColumn("mean", $"sum(age)"/totalEntries).show
+--------+----+
|sum(age)|mean|
+--------+----+
|      10| 2.5|
+--------+----+

val df = Seq(1,2,3,4).toDF("age")

相关内容

  • 没有找到相关文章

最新更新