简体   繁体   English

尝试从RDD返回Map [(String,String),(Double,Double)]时无法将java.lang.String强制转换为java.lang.Double错误

[英]java.lang.String cannot be cast to java.lang.Double Error when trying to return Map[(String, String),(Double, Double)] from RDD

I am trying to read a .txt file with | 我正在尝试使用|读取.txt文件| delimiters as an RDD and trying return a Map[(String, String),(Double, Double)] , however I am running into CastException 分隔符作为RDD并尝试返回Map[(String, String),(Double, Double)] ,但是我遇到了CastException

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double

input data looks like this 输入数据如下所示

string1|string2|100.00|200.00
string1|string2|34.98|0.989

this is how i am reading the file as rdd and parsing it 这就是我作为rdd读取文件并解析它的方式

val mydata = sc
  .textFile("file")
  .map(line => line.split("|"))
  .map(row =>
    ((row(0), row(1)),
     (row(2).asInstanceOf[Double], row(3).asInstanceOf[Double])))
  .collect
  .toMap

How can I fix this issue 我该如何解决这个问题

expected o/p: 预期输出:

Map[(String, String),(Double, Double)] = Map((string1,string2) -> (100.0,200.0), (string1,string2) -> (34.98,0.989))

To be on the safe side you can use trim function and you can use collectAsMap 为了安全起见,您可以使用trim函数,也可以使用collectAsMap

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)),
      (row(2).trim.asInstanceOf[Double], row(3).trim.asInstanceOf[Double])))
  .collectAsMap()

And to be more safe you can use Try/getOrElse 为了更加安全,您可以使用Try/getOrElse

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)),
      (Try(row(2).trim.asInstanceOf[Double]).getOrElse(0.0), Try(row(3).trim.asInstanceOf[Double]).getOrElse(0.0))))
  .collectAsMap()

Moreover you can use toDouble instead of asInstanceOf[Double] 此外,您可以使用toDouble代替asInstanceOf[Double]

val mydata = sc
  .textFile("file")
  .map(line => line.split("\\|"))
  .map(row =>
    ((row(0), row(1)), 
      (Try(row(2).trim.toDouble).getOrElse(0.0), Try(row(3).trim.toDouble).getOrElse(0.0)))
  )
  .collectAsMap().foreach(println)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将Map [String,Double]转换为java.util.Map [String,java.lang.Double] - Converting Map[String, Double] to java.util.Map[String, java.lang.Double] 创建RDD [LabeledPoint]:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Double - Creation of RDD[LabeledPoint]: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double 异常:java.lang.Double 不能转换为 [D - Exception:java.lang.Double cannot be cast to [D 如何修复 Spark (Scala) 中的“java.lang.Integer cannot be cast to java.lang.Double”错误? - How to fix "java.lang.Integer cannot be cast to java.lang.Double" Error in Spark (Scala)? 在下面的代码中,出现 java.lang.String 之类的错误不是双模式的有效外部类型 - Getting error like java.lang.String is not a valid external type for schema of double In below code org.apache.spark.ml.linalg.DenseVector 不能转换为 java.lang.Double - org.apache.spark.ml.linalg.DenseVector cannot be cast to java.lang.Double scala.collection.mutable.ArrayBuffer无法转换为java.lang.Double(Spark) - scala.collection.mutable.ArrayBuffer cannot be cast to java.lang.Double (Spark) java.lang.ClassCastException:[B在解析json [String,String]时不能转换为java.lang.String - java.lang.ClassCastException: [B cannot be cast to java.lang.String while parsing json[String,String] java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.Float - java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Float scala.Some无法强制转换为java.lang.String - scala.Some cannot be cast to java.lang.String
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM