Spark Scala过滤RDD时遇"Item does not take parameters"错误的解决
修复Spark中Case Class字段访问的错误
嘿,这个问题其实很容易解决——你出错的地方根本不是case class的定义,而是访问case class字段的方式搞错啦!
错误原因
你定义的Item是一个Scala case class,它的字段是通过**属性访问(点号.)**来获取的,而不是像数组/列表那样用下标x(0)来访问。你写的x(0)相当于把Item实例当成一个可索引的集合来调用,但Item类根本没有实现这种索引操作,所以才会抛出"Item does not take parameters"的错误。
你的case class定义本身是完全没问题的,所有字段都正确声明了,问题就出在过滤逻辑里的字段访问部分。
修复后的代码
把过滤代码里的x(0)改成x.date(因为date是你case class里定义的第一个字段,对应CSV里的第一列)就可以了:
// 原错误代码 // val Jan = q1.filter {x=> x(0) == "201601"} // val Feb = q1.filter {x=> x(0) == "201602"} // val Mar = q1.filter {x=> x(0) == "201603"} // 修复后的代码 val Jan = q1.filter(x => x.date == "201601") val Feb = q1.filter(x => x.date == "201602") val Mar = q1.filter(x => x.date == "201603")
额外优化建议
如果要处理多个月份,重复写filter会有点繁琐,你可以用一个集合来批量生成各月份的RDD,比如:
// 定义需要拆分的月份列表 val targetMonths = List("201601", "201602", "201603") // 生成月份到对应RDD的映射 val monthRDDMap = targetMonths.map(month => month -> q1.filter(_.date == month)).toMap // 之后可以直接通过月份字符串获取对应的RDD val janRDD = monthRDDMap("201601") val febRDD = monthRDDMap("201602")
这样代码会更简洁,也方便后续扩展更多月份的处理。
内容的提问来源于stack exchange,提问作者Lauren
相关产品推荐
相关产品推荐

