Scala 使用spark上的映射函数更新变量
这是我的密码:Scala 使用spark上的映射函数更新变量,scala,apache-spark,cluster-computing,Scala,Apache Spark,Cluster Computing,这是我的密码: val dataRDD = sc.textFile(args(0)).map(line => line.split(" ")).map(x => Array(x(0).toInt, x(1).toInt, x(2).toInt)) var arr = new Array[Int](3) printArr(arr) dataRDD.map(x => {arr=x}) printArr(arr) 此代码工作不正常。如何才能使其成功工作?好的,因此RDD上的操作由不
val dataRDD = sc.textFile(args(0)).map(line => line.split(" ")).map(x => Array(x(0).toInt, x(1).toInt, x(2).toInt))
var arr = new Array[Int](3)
printArr(arr)
dataRDD.map(x => {arr=x})
printArr(arr)
此代码工作不正常。如何才能使其成功工作?好的,因此RDD上的操作由不同的工作人员并行执行(通常在集群中的不同机器上),因此您不能传入要更新的这种类型的“全局”对象
arr
。你看,每个工人都会收到自己的arr
副本,他们会更新该副本,但司机永远不会知道
我猜您在这里要做的是从RDD收集所有数组,这可以通过一个简单的collect
操作来完成:
val dataRDD = sc.textFile(args(0)).map(line => line.split(" ")).map(x => Array(x(0).toInt, x(1).toInt, x(2).toInt))
val arr = dataRDD.collect()
其中
arr
具有类型Array[Array[Int]]
。然后,您可以使用常规数组操作运行arr
请解释它应该如何工作,以及它是如何不工作的。您是否收到任何错误?RDD是不可变的!您需要使用应用的转换创建一个新的数组。非常感谢。然后,首先,我初始化数组arr(根据定义),然后,我计算新数组arr(dataRDD),因此,我要分配新的arr(dataRDD)对于旧的arr。这是关于在spark上更新变量的问题。你能帮我吗?@Glennie Helles SindholtI不知道为什么要初始化arr
,但是如果出于某种原因需要,你可以添加var arr=Array(新数组[Int](3))
,然后将上面的行更改为arr=dataRDD.collect()
。请注意,只有RDD上的操作是并行进行的。您可以在arr
(它只是一个普通数组)上执行的任何操作都在驱动程序上处理(而不是并行处理)