Scala RDD读取TSV文件调用toInt抛出NumberFormatException求助
问题根因
Scala 提供的String.toInt方法仅支持转换标准整数格式的字符串,输入字符串不能包含小数点、非数字字符。你的数据集第一列为浮点型评分值(如样例中的1.6339、报错信息中的0.5312),不符合toInt的输入格式要求,因此会抛出NumberFormatException异常。
解决方案
你可以根据业务需求选择以下任意一种方案解决问题:
- 先转浮点类型再转整数
如果业务要求必须输出整数类型的评分,可先将字符串转为Double类型,再转为整数:- 截断小数位取整:
val ratesRDD = moviesRDD.map(r => (r(2), r(0).toDouble.toInt))- 四舍五入取整:
val ratesRDD = moviesRDD.map(r => (r(2), math.round(r(0).toDouble).toInt)) - 增加脏数据校验过滤
为避免存在空值、非数字格式的异常数据打断任务运行,可增加安全转换逻辑过滤非法数据:import scala.util.Try val ratesRDD = moviesRDD.map(r => (r(2), Try(r(0).toDouble.toInt).toOption)) .filter(_._2.isDefined) .map(r => (r._1, r._2.get)) - 保留原始浮点类型
如果业务不需要对评分取整,可直接保留Double类型使用,无需转Int:
后续的val ratesRDD = moviesRDD.map(r => (r(2), r(0).toDouble))reduceByKey(math.max(_, _))逻辑无需修改,math.max原生支持Double类型的数值比较。
内容的提问来源于stack exchange,提问作者Linna
相关产品推荐
相关产品推荐

