使用Scala消除Spark中的for循环

使用Scala消除Spark中的for循环,scala,apache-spark,parallel-processing,Scala,Apache Spark,Parallel Processing,我有一个场景。我迭代了一系列的数据帧。使用FOR循环对每个对象执行相同类型的操作,并将转换后的数据帧存储在映射中(String->DataFrame) for(df检查下面的代码 def logic(df: DataFrame):Map[String,DataFrame] = { // Return Map[String,DataFrame] } val dfa = // DataFrame 1 val dfb = // DataFrame 2 val dfc = // DataFr

我有一个场景。我迭代了一系列的数据帧。使用FOR循环对每个对象执行相同类型的操作,并将转换后的数据帧存储在映射中(String->DataFrame)

for(df检查下面的代码

def logic(df: DataFrame):Map[String,DataFrame] = {
    // Return Map[String,DataFrame] 
}

val dfa = // DataFrame 1
val dfb = // DataFrame 2
val dfc = // DataFrame 3

Seq(dfa,dfb,dfc,dfd)
.par // Parallel
.map(logic) // invoking logic function for every dataframe.
.reduce( _ ++ _ ) // Final result in Map["aaa" -> dfa,"bbb" -> dfb,"ccc" -> dfc]

更新

def writeToMap(a: Int, i: Int) = Map(a -> i)
def doOperation(a: Int)=writeToMap(a,a+10)
val list = Seq.range(0, 33) 
list.par.map(x => doOperation(x))
.map
使用该对映射每个元素
.toMap
会将结果聚合为一个映射


注:<代码>某个名字< /代码>对于每个数据框

都是唯一的,你能发布完整的代码吗?PAR保证了SEQ中每个元素的执行吗?我在一个简单的10K变量列表中使用PAR并打印出来。它跳过了一些。这就是为什么Askigi不确定的原因……我没有在我的生产代码中遇到这个问题……如果你不这样做的话……尝试使用这个<代码> PAR 尝试其他类似MUNIX的库。你做的是错误的,在并行线程中从来没有尝试更新变量,在你的情况下,你正在更新地图,这总是会给你错误的结果。如果我正确地理解,你可以得到与这个列表相同的结果。PAR.MAP(I= > WrimeToMAP(I,I + 10))。.sizechanged您的writeToMap函数-def writeToMap(a:Int,i:Int)={Map(a->i)}在上面的代码段中转换代码将在哪里执行?在驱动程序上创建数据帧映射不是一项繁重的操作这是一项繁重的操作:将固定宽度文件(DF)转换为DF
def writeToMap(a: Int, i: Int) = Map(a -> i)
def doOperation(a: Int)=writeToMap(a,a+10)
val list = Seq.range(0, 33) 
list.par.map(x => doOperation(x))
val dfList : List[DataFrame] =  // Your Dataframe list 

val dfMap : Map[String,DataFrame] = dfList.map("some_name" -> _).toMap