我有一个(大到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来最大化性能。
答案 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)
结果
+---+-----+-------------+
| 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