Databricks Scala 上不同数量的列的舍入值

Round values of a varying quantity of columns on Databricks Scala

我在 Databricks 上使用 Scala 并且:

我不想为需要四舍五入的每一列写一行特定的代码,因为可能有很多列需​​要四舍五入并且它们各不相同。

为此,我尝试使用 Map 创建一个函数(不确定这是否是最佳选择):

def roundValues(precision: Int)(df: DataFrame): DataFrame = {

val roundedCols = df.columns.map(c => round(col(c), precision).as(c))

df.select(roundedCols: _*)

}

df.transform(roundValues(0))

但我总是出错,因为前 Y 列是字符串、日期或其他类型。

我的问题:

  1. 如何舍入所有必要列的值?
  2. 开头的 Y 列数以及我需要舍入的 N-Y 列数可能会有所不同。有没有办法让我不必手动插入需要四舍五入的列的名称? (例如:仅舍入 float 类型的列,忽略所有其他列)
  3. 最后,我应该把float类型转换成其他类型吗?我将使用最终的数据框来做一些绘图或一些简单的计算。这些东西我不再需要小数了。

您可以从数据框架构中获取数据类型信息:

import org.apache.spark.sql.types.FloatType

val floatColumns = df.schema.fields.filter(_.dataType == FloatType).map(_.name)

val selectExpr = df.columns.map(c =>
  if (floatColumns.contains(c)) 
     round(col(c), 0).as(c) 
  else col(c)
)

val df1 = df.select(selectExpr: _*)