【问题标题】:How to perform mathematical operation on Long and BigInt in scala in spark-sql如何在 spark-sql 的 scala 中对 Long 和 BigInt 执行数学运算
【发布时间】:2017-06-12 02:16:53
【问题描述】:

我在 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,totalEntries 是 Long。我想对其进行数学运算。平均值 = ageSum/totalEntries

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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 的另一列:

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

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

    【讨论】:

    • 这很有魅力。谢谢。我正在努力寻找与数据框支持的操作相关的文档。你知道这件事有什么好文章吗?
    • 您可以查看this website。但并非所有功能都列在数据框下。目前没有更好的资源。
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 2020-04-02
    • 2021-02-09
    • 1970-01-01
    • 2022-08-15
    • 2023-01-10
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多