如何在Scala Spark中舍入小数

时间:2018-12-26 04:56:03

标签: scala apache-spark dataframe concurrency

我有一个(大到100万个)Scala Spark DataFrame,其中包含以下数据:

id,score
1,0.956
2,0.977
3,0.855
4,0.866
...

如何将分数离散化/四舍五入到最接近的0.05小数位?

预期结果:

id,score
1,0.95
2,1.00
3,0.85
4,0.85
...

要避免使用UDF来最大化性能。

3 个答案:

答案 0 :(得分:8)

答案可能很简单:

dataframe.withColumn("rounded_score", round(col("score"), 2))

有一种方法

def round(e: Column, scale: Int)

使用HALF_UP舍入模式将e的值四舍五入到scale小数位

答案 1 :(得分:3)

您可以使用诸如此类的内置函数来实现

dataframe.withColumn("rounded_score", round(col("score") * 100 / 5) * 5 / 100)
  1. 将其乘以所需的精度为整数。
  2. 然后将该数字除以5,然后四舍五入。
  3. 现在该数字可以除以5,因此将其乘以5即可得到整个数字
  4. 除以100以再次获得正确的精度。

结果

+---+-----+-------------+
| id|score|rounded_score|
+---+-----+-------------+
|  1|0.956|         0.95|
|  2|0.977|          1.0|
|  3|0.855|         0.85|
|  4|0.866|         0.85|
+---+-----+-------------+

答案 2 :(得分:1)

您可以在转换为dataframe时指定架构,

示例:

加载数据时,您的customSchema中的列的

DecimalType(10,2)。

id,score
1,0.956
2,0.977
3,0.855
4,0.866
...



import org.apache.spark.sql.types._

val mySchema = StructType(Array(
  StructField("id", IntegerType, true),
   StructField("score", DecimalType(10, 2), true)
))

spark.read.format("csv").schema(mySchema).
  option("header", "true").option("nullvalue", "?").
  load("/path/to/csvfile").show