Spark中从DataFrame转换的RDD拆分时报参数类型缺失错误求助
解决RDD拆分时的"missing parameter type"错误
我来帮你排查这个问题~ 你遇到的这个错误本质是Scala类型推断失效导致的,和你的SQL查询或者DataFrame转RDD的步骤无关(从take(1)的结果能看到Row数据是正常的),问题出在你对JavaRDD[Row]进行拆分操作的代码里,具体原因和解决办法如下:
错误原因
你把DataFrame转成了JavaRDD[Row],而JavaRDD是Spark为Java API设计的组件。在Scala环境下操作JavaRDD时,Scala编译器没法自动推断lambda表达式里参数的类型——比如你写row => row.getString(...)的时候,编译器不知道row到底是什么类型,所以会抛出"missing parameter type"的错误。
解决办法
办法1:显式指定参数类型
如果你一定要用JavaRDD,只需要在lambda的参数上明确标注类型即可:
// 示例:拆分Row中某一列的字符串 val splitRdd = rddF.map((row: org.apache.spark.sql.Row) => { // 这里以拆分第一列为例,你可以换成需要处理的列 row.getString(0).split(",") })
明确告诉编译器row是Row类型,就能正常执行拆分操作了。
办法2:改用Scala原生RDD(更推荐)
既然你是在Scala环境下开发,完全没必要用JavaRDD,直接用Spark为Scala设计的原生RDD会更顺手,类型推断也更流畅:
// 把df.toJavaRDD换成df.rdd val rddF = df.rdd // 这时拆分操作不需要显式指定类型,编译器能自动推断row的类型 val splitRdd = rddF.map(row => row.getString(0).split(","))
额外说明
从你提供的take(1)结果来看,Row里的字段都是正常存在的,所以只要解决类型推断的问题,拆分操作就能正常运行啦。
内容的提问来源于stack exchange,提问作者knowone
相关产品推荐
相关产品推荐

