想要将输出作为Object而不是println

时间:2016-09-24 11:39:41

标签: scala apache-spark foreach


我想制作一个对象而不是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])
        ...
    )

看起来简单的语法知识 但我无法理解这一点。

3 个答案:

答案 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)

谢谢你的帮助Chobeat!
我修复了foreach到map并添加了一些行 但编译器跳过它..
我错过了什么吗?

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'是两种不同的表达方式。变量作为起始点,意味着过滤器'没有使用,你仍然映射空记录。