Проблема здесь
val mappedDpt = dept.map(p => Department( p(0).toInt,p(1).toString))
p
здесь есть строка , а не строка (как вы, возможно, думаете) ,Чтобы быть более точным здесь p
- это каждая строка текстового файла, вы можете подтвердить, что чтение scaladoc .
" возвращает RDD строктекстового файла ".
Итак, когда вы применяете метод apply
((0)
) , вы получаете доступ к символу по позиции в строке.
Вот почему вы получаете "49, ','"
49 от toInt
первого символа, который возвращает значение ascii символа, и ','
от второго символа в строке.
Edit
Если вам нужно воспроизвести метод read
, вы можете сделать следующее:
object Department {
/** The Option here is to handle errors. */
def fromRawArray(data: Array[String]): Option[Department] = data match {
case Array(raw_dept_id, dept_name) => Some(Department(raw_dept_id.toInt, dept_name))
case _ => None
}
}
// We use flatMap instead of map, to unwrap the values from the Option, the Nones get removed.
val mappedDpt = dept.flatMap(line => Department.fromRawArray(line.split(",")))
Однако я надеюсь, что это только для обучения.В производственном коде вы всегда должны использовать версию read
.Так как он будет более устойчивым (обработка пропущенных значений, более качественное приведение типов и т. Д.) .
Например, приведенный выше код вызовет исключение, если первое значение не может быть приведено к Int .