scala - Scala和Spark : Cast multiple columns at once

标签 scala apache-spark

由于 VectorAssembler 崩溃,如果传递的列具有NumericTypeBooleanType以外的任何其他类型,并且我正在处理许多TimestampType列,我想知道:

有一种简单的方法可以一次转换多列吗?

基于this answer,我已经有一种方便的方法来转换单个列:

def castColumnTo(df: DataFrame, 
    columnName: String, 
    targetType: DataType ) : DataFrame = {
      df.withColumn( columnName, df(columnName).cast(targetType) )
}

我曾考虑过递归调用castColumnTo,但我强烈怀疑这是(性能)方法。

最佳答案

在scala中使用惯用方法类型转换所有列

def castAllTypedColumnsTo(df: DataFrame, sourceType: DataType, targetType: DataType) = {
df.schema.filter(_.dataType == sourceType).foldLeft(df) {
    case (acc, col) => acc.withColumn(col.name, df(col.name).cast(targetType))
 }
}

关于scala - Scala和Spark : Cast multiple columns at once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997462/

相关文章:

apache-spark - 为什么Spark saveAsTable 和bucketBy 创建了数千个文件?

scala - 如何找到项目的 Play Framework 版本?

scala - 如何在单元测试中抑制 Spark 日志记录?

apache-spark - 如何解决java.lang.OutOfMemoryError : Java heap space when train word2vec model in Spark?

hadoop - Hbase region数量持续增长

scala - 不重复某些元组的 RDD 产品

java - DBSCAN 及其索引是否应该具有相同的距离函数

eclipse - 如何在sbt项目中声明对Scalding的依赖?

scala - 表单中的错误缺少匹配类型

docker - 如何使用 Docker 创建分布式 spark 集群