Я пытаюсь прочитать файл .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

Как я могу исправить эту проблему

Ожидаемый o / p:

Map[(String, String),(Double, Double)] = Map((string1,string2) -> (100.0,200.0), (string1,string2) -> (34.98,0.989))
1
Sanjay 19 Июн 2018 в 19:22

1 ответ

Лучший ответ

На всякий случай можно использовать функцию 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)
2
Ramesh Maharjan 19 Июн 2018 в 17:13