![](/img/trans.png)
[英]Converting Map[String, Double] to java.util.Map[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
我正在嘗試使用|
讀取.txt文件|
分隔符作為RDD並嘗試返回Map[(String, String),(Double, Double)]
,但是我遇到了CastException
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double
輸入數據如下所示
string1|string2|100.00|200.00
string1|string2|34.98|0.989
這就是我作為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
我該如何解決這個問題
預期輸出:
Map[(String, String),(Double, Double)] = Map((string1,string2) -> (100.0,200.0), (string1,string2) -> (34.98,0.989))
為了安全起見,您可以使用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()
為了更加安全,您可以使用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()
此外,您可以使用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.