Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将dataframe中的字符串数据转换为双精度_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 将dataframe中的字符串数据转换为双精度

Scala 将dataframe中的字符串数据转换为双精度,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个包含双类型的csv文件。当我加载到数据帧时,我收到一条消息,告诉我类型字符串是java.lang.string不能转换为java.lang.double,尽管我的数据是数字。我如何从这个包含双类型的csv文件中获取数据帧。我应该如何修改代码 import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import org.apache.spark.sql.SparkSession import org.apa

我有一个包含双类型的csv文件。当我加载到数据帧时,我收到一条消息,告诉我类型字符串是java.lang.string不能转换为java.lang.double,尽管我的数据是数字。我如何从这个包含双类型的csv文件中获取数据帧。我应该如何修改代码

import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{ArrayType, DoubleType}
import org.apache.spark.sql.functions.split
import scala.collection.mutable._

object Example extends App {

val spark = SparkSession.builder.master("local").appName("my-spark-app").getOrCreate()
val data=spark.read.csv("C://lpsa.data").toDF("col1","col2","col3","col4","col5","col6","col7","col8","col9")
val data2=data.select("col2","col3","col4","col5","col6","col7")

我应该如何将数据帧中的每一行转换为双类型?谢谢

使用
选择
cast

import org.apache.spark.sql.functions.col

data.select(Seq("col2", "col3", "col4", "col5", "col6", "col7").map(
  c => col(c).cast("double")
): _*)
或将架构传递给读取器:

  • 定义架构:

    import org.apache.spark.sql.types._
    
    val cols = Seq(
      "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9"
    )
    
    val doubleCols = Set("col2", "col3", "col4", "col5", "col6", "col7")
    
    val schema =  StructType(cols.map(
      c => StructField(c, if (doubleCols contains c) DoubleType else StringType)
    ))
    
  • 并将其用作
    schema
    方法的参数

    spark.read.schema(schema).csv(path)
    
也可以使用模式推断:

spark.read.option("inferSchema", "true").csv(path)

但是它要昂贵得多。

我相信在读取csv文件时,使用sparks
Infreschema
选项会很方便。以下是自动将列检测为双精度类型的代码:

val data = spark.read
                .format("csv")
                .option("header", "false")
                .option("inferSchema", "true")
                .load("C://lpsa.data").toDF()


Note: I am using spark version 2.2.0 

需要导入什么?@Sade架构的所有导入都存在。而且
col
org.apache.spark.sql.functions.col
谢谢,它现在可以工作了,但是当我运行df.show()时,它会声明NameError:name'df'没有定义。为什么会这样?另一个问题是,Seq(…)是只选择指定的列并删除其余的列,还是选择指定的列、更新它并仍然保留其余的列?“它好像要掉下来了。@请仔细检查您的代码。听起来这不是您使用的名称。我最终使用了以下名称:%scala val df2=df.withColumn(“start_t”),df(“start_t”).cast(“string”))