无法在spark scala数据帧中强制转换值

无法在spark scala数据帧中强制转换值,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我试图从数字中解析数据 环境:DataBricks Scala 2.12 Spark 3.1 我选择了被错误地解析为字符串的列,原因是有时数字是用逗号写的,有时是用点写的 我试图首先替换所有逗号,将其解析为浮点数,创建浮点数类型的模式,并重新创建数据帧,但它不起作用 import org.apache.spark.sql._ import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, F

我试图从数字中解析数据

环境:DataBricks Scala 2.12 Spark 3.1

我选择了被错误地解析为字符串的列,原因是有时数字是用逗号写的,有时是用点写的

我试图首先替换所有逗号,将其解析为浮点数,创建浮点数类型的模式,并重新创建数据帧,但它不起作用

import org.apache.spark.sql._
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType, FloatType};
import org.apache.spark.sql.{Row, SparkSession}
import sqlContext.implicits._ 
//temp is a dataframe with data that I included below
val jj = temp.collect().map(row=> Row(row.toSeq.map(it=> if(it==null) {null} else {it.asInstanceOf[String].replace( ",", ".").toFloat }) ))
val schemaa = temp.columns.map(colN=> (StructField(colN, FloatType, true)))
val newDatFrame = spark.createDataFrame(jj,schemaa)
数据屏幕

CSV


您可以使用Spark SQL
regexp\u replace
映射列<不需要代码>收集,也不会提供良好的性能。您可能还希望使用
double
而不是
float
,因为有些条目有许多小数位

val new_df = df.select(
    df.columns.map(
        c => regexp_replace(col(c), ",", ".").cast("double").as(c)
    ):_*
)

非常感谢。但我想它是用python编写的,你能不能也用scala给出一个例子?这是用scala编写的。为什么你认为它是在Python中?对不起,正则表达式替换思想是Python的典型思想,你是对的!我只是没有输入它,它的作品谢谢!!
val new_df = df.select(
    df.columns.map(
        c => regexp_replace(col(c), ",", ".").cast("double").as(c)
    ):_*
)