【问题标题】:scala & Spark - ArrayBuffer does not appendscala & Spark - ArrayBuffer 不附加
【发布时间】:2015-09-08 10:48:38
【问题描述】:

我是 Scala 和 Apache Spark 的新手,并且一直在尝试一些在线示例。

我正在使用 scala.collection.mutable.ArrayBuffer 来存储 (Int,Array[String]) 形式的元组列表。我正在创建一个 ArrayBuffer,然后逐行解析一个文本文件,并将每行所需的数据附加到 ArrayBuffer。

代码没有编译错误。但是,当我在要附加它的块之外访问 ArrayBuffer 时,我无法获取内容并且 ArrayBuffer 始终为空。

我的代码在下面-

val conf = new SparkConf().setAppName("second")
val spark = new SparkContext(conf)

val file = spark.textFile("\\Desktop\\demo.txt")
var list = scala.collection.mutable.ArrayBuffer[(Int, Array[String])]()
var count = 0

file.map(_.split(","))
.foreach { a =>
count = countByValue(a) // returns an Int
println("count is " + count) // showing correct output "count is 3"
var t = (count, a)
println("t is " + t) // showing correct output "t is (3,[Ljava.lang.String;@539f0af)"
list += t
}

println("list count is = " + list.length) // output "list count is = 0"
list.foreach(println) // no output

有人能指出为什么这段代码不起作用。

非常感谢任何帮助。

【问题讨论】:

    标签: scala collections apache-spark tuples arraybuffer


    【解决方案1】:

    我假设sparkSparkContext。在这种情况下,本地list 没有更新并不奇怪,只是将其副本作为闭包发送到 spark。如果您需要 foreach 中的可变值,则应使用 Accumulator

    【讨论】:

    • 我应该补充一点,ArrayBuffer+= 不是关联的,因此您需要修改您的要求或使用其他东西。
    • 谢谢。 spark 是一个 SparkContext。我已经编辑了代码以使其更清晰。我将尝试为 ArrayBuffer 使用自定义累加器。您能否建议 += 的其他替代方法?
    • 不,在减少(累积)阶段,减少的顺序没有定义,所以值可以是任何顺序。可能如果您 zipWithIndex 原始 RDD 并将该信息用作附加元组值,您可以利用累加器的输出来保持原始顺序。
    • ++ArrayBuffers 是关联的,所以这可能毕竟是可行的。抱歉,这里已经很晚了。)
    • 因为我不希望值按顺序排列,所以我为 ArrayBuffer 创建了一个自定义累加器,并在累加器的 addInPlace 方法中为 ArrayBuffer 使用了 ++。我现在能够在 foreach 块之后获取 ArrayBuffer 的内容。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2020-08-21
    • 2016-11-05
    相关资源
    最近更新 更多