当前位置: 首页 > 知识库问答 >
问题:

Scala&Spark:一次强制转换多列

裴姚石
2023-03-14

由于VectorAssembler正在崩溃,如果传递的列有NumericTypeBooleAntype以外的其他类型,并且我正在处理大量TimestampType列,我想知道:

有没有一种简单的方法,一次强制转换多个列?

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

共有1个答案

戚飞雨
2023-03-14

在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编写一个udf函数,并在pyspark工作中使用它。我的数据帧模式是 我正在尝试编写一个udf函数 在这个map函数中,我试图将行强制转换为case类,但无法。我犯了这个错误。 java.lang.ClassCast异常:org.apache.spark.sql.catalyst.expressions.GenericRowwith模式不能强制转换为变量计算变量计算$myRow3

  • 我正在使用Akka HTTP(在Scala中)开发一个REST服务。我希望传入http get请求的参数转换为ZonedDateTime类型。如果我尝试使用String或Int但在使用ZonedDateTime类型时失败,则代码可以正常工作。代码如下所示: 下面是我看到的错误: 如果我向列表中添加多个参数,我会得到一个不同的错误: 下面是一个代码片段,它将重现我看到的问题

  • 我的spark-submit命令是: ~/spark-2.1.1-bin-hadoop2.6/bin/spark-submit--主纱--部署模式客户端--驱动程序--内存4G--executor-memory 2G--executor-cores 4--类consumer.spark.sample~/sparkstreamingjob/log_testing.jar~/sparkstreamin

  • 我有一个数据帧,它有可变数量的列,如Col1,Col2,Col3。我需要使用下面的代码将Col1和Col2合并到一列数据类型映射中。 但是在不知道列的数量和名称的情况下,如何对所有的列都这样做呢?

  • 我有一个如下的CSV文件。 我想把这个转化成下面。 基本上,我想在输出数据帧中创建一个名为idx的新列,该列将填充与键=idx,value=“n”后面的行相同的值“n”。

  • 我有一个有30多个字符串的列表。如何将list转换为dataframe?我所尝试的: