scala - 如何优化 spark 函数以将双精度值舍入到小数点后 2 位?
问题描述
下面是我的 Spark 函数,它是直截了当的
def doubleToRound(df:DataFrame,roundColsList:Array[String]): DataFrame ={
var y:DataFrame = df
for(colDF <- y.columns){
if(roundColsList.contains(colDF)){
y = y.withColumn(colDF,functions.round(y.col(colDF),2))
}
}
这按预期工作,通过使给定 DF 的多个列的值将十进制值四舍五入到 2 个位置。但是我正在遍历 DataFrame y,直到列 Array[Sting].length()。做上述任何更好的方法?
谢谢你们
解决方案
您可以简单地select
与 a 一起使用map
,如下例所示:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("a", 1.22, 2.333, 3.4444),
("b", 4.55, 5.666, 6.7777)
).toDF("id", "v1", "v2", "v3")
val roundCols = df.columns.filter(_.startsWith("v")) // Or filter with other conditions
val otherCols = df.columns diff roundCols
df.select(otherCols.map(col) ++ roundCols.map(c => round(col(c), 2).as(c)): _*).show
// +---+----+----+----+
// | id| v1| v2| v3|
// +---+----+----+----+
// | a|1.22|2.33|3.44|
// | b|4.55|5.67|6.78|
// +---+----+----+----+
使其成为一种方法:
import org.apache.spark.sql.DataFrame
def doubleToRound(df: DataFrame, roundCols: Array[String]): DataFrame = {
val otherCols = df.columns diff roundCols
df.select(otherCols.map(col) ++ roundCols.map(c => round(col(c), 2).as(c)): _*)
}
或者,使用foldLeft
andwithColumn
如下:
def doubleToRound(df: DataFrame, roundCols: Array[String]): DataFrame =
roundCols.foldLeft(df)((acc, c) => acc.withColumn(c, round(col(c), 2)))
推荐阅读
- git - VCS 文件颜色未在 Android Studio 中显示
- android - Android 模拟器 27.3.9:'WHvGetCapability 失败。hr=0x00000000 whpx_cap.HypervisorPresent?0'
- java - 在 map 函数中创建辅助 RDD
- sql - Mysql 创建插入过程语句不完整
- java - Elasticsearch Translog 已关闭错误
- mysql - 组功能使用无效 1111
- r - 使用 dplyr 在填充了某些条件的数据框中创建列
- coldfusion - Coldfusion中的Url编码问题
- sapui5 - SAP UI5中的TreeTable没有子行
- android - 尝试使用 ButtonTheme 设置最小宽度时出错