Databricks Scala 上不同数量的列的舍入值
Round values of a varying quantity of columns on Databricks Scala
我在 Databricks 上使用 Scala 并且:
- 我有一个包含 N 列的数据框。
- 除了前 Y 列之外的所有列都是“浮点数”类型,并且我希望将数字四舍五入为 0 位小数。
我不想为需要四舍五入的每一列写一行特定的代码,因为可能有很多列需要四舍五入并且它们各不相同。
为此,我尝试使用 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 列是字符串、日期或其他类型。
我的问题:
- 如何舍入所有必要列的值?
- 开头的 Y 列数以及我需要舍入的 N-Y 列数可能会有所不同。有没有办法让我不必手动插入需要四舍五入的列的名称? (例如:仅舍入 float 类型的列,忽略所有其他列)
- 最后,我应该把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: _*)
我在 Databricks 上使用 Scala 并且:
- 我有一个包含 N 列的数据框。
- 除了前 Y 列之外的所有列都是“浮点数”类型,并且我希望将数字四舍五入为 0 位小数。
我不想为需要四舍五入的每一列写一行特定的代码,因为可能有很多列需要四舍五入并且它们各不相同。
为此,我尝试使用 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 列是字符串、日期或其他类型。
我的问题:
- 如何舍入所有必要列的值?
- 开头的 Y 列数以及我需要舍入的 N-Y 列数可能会有所不同。有没有办法让我不必手动插入需要四舍五入的列的名称? (例如:仅舍入 float 类型的列,忽略所有其他列)
- 最后,我应该把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: _*)