我想制作一个对象而不是println。
文本文件就像是
“长野,苹果”
“长野,鸭梨”
“得克萨斯,柚”
“里奥,番石榴”
“力,番石榴”
和结果如
“(长野,苹果,1)”
“(长野,梨,1)”
“(得克萨斯,葡萄柚,1)”
“(RIO,番石榴,2)”
def main(args: Array[String]) = {
val conf = new SparkConf()
.setAppName("WordCount")
.setMaster("local")
val sc = new SparkContext(conf)
// read text info
val textfile = sc.textFile("C:\\fruitbox.csv")
twitter.filter(_.nonEmpty)
val map = twitter.map { word => (word, 1) }
.reduceByKey(_ + _)
.foreach(println) // ← want to do something about this row
}
但我想让println结果像这样
.foreach(
fruitbox.setCity(_.split(",")[0])
fruitbox.setApple(_.split(",")[1])
...
)
看起来简单的语法知识 但我无法理解这一点。
答案 0 :(得分:0)
你需要在功能方面考虑它,否则你会发疯。将foreach
替换为具有此格式函数的map
:
.map(myInputTuple=>MyCaseClass(myInputTuple._0,myInputTuple._1,myInputTuple._2))
你知道案例类吗?如果你不这样做,你应该看一看并定义自己的数据来保存你处理的数据。否则,如果要构建具有setter的现有类的特定实例,可以这样做:
.map(myInputTuple=>{
val myInstance = new myClass()
myInstance.setField1(myInputTuple._0)
...
myInstance
}
)
注意括号:{}
这些定义了一个范围,您可以在其中编写非功能代码,此范围的最后一个值将是返回的值,在本例中是您的类的实例。
另外,当您发布有关Spark的内容时,请尝试明确您在每一步处理的类型,以便编写代码来帮助您。
答案 1 :(得分:0)
val map = twitter.map { word => (word, 1) }
.reduceByKey(_ + _)
.map(obj => { // ← SKIPS FROM HERE
var arg = obj._1.split(",")
val twitterInfo = new TwitterInfo(arg.apply(0), arg.apply(1), obj._2)
list:+=(twitterInfo)
})
答案 2 :(得分:0)
什么是'列表:+ =(twitterinfo)' ? 你不应该使用可变状态,而是从地图'中返回一个结果。而不是功能。
另外,我在问题中注意到了' twitter.filter'和' twitter.map'使用' twitter'是两种不同的表达方式。变量作为起始点,意味着过滤器'没有使用,你仍然映射空记录。