繁体   English   中英

如何用scala并行化spark中的for循环?

[英]How can I parallelize a for loop in spark with scala?

例如,我们有一个镶木地板文件,过去3年有2000个股票代码的收盘价,我们想要计算每个符号的5天移动平均线。

所以我创建了一个Spark SQLContext然后

val marketData = sqlcontext.sql("select DATE, SYMBOL, PRICE from stockdata order by DATE").cache()

要获取符号列表,

val symbols = marketData.select("SYMBOL").distinct().collect()

这是for循环:

for (symbol <- symbols) {
  marketData.filter(symbol).rdd.sliding(5).map(...calculating the avg...).save()
}

显然,对spark执行for循环很慢,而且每个小结果的save()也会减慢进程的速度(我已经尝试在for循环外定义一个var result并联合所有输出以使IO操作在一起,但是我得到了stackoverflow异常),那么如何并行化for循环并优化IO操作?

您编写的程序在驱动程序(“主”)spark节点中运行。 如果您在并行结构(RDD)上运行,则此程序中的表达式只能并行化。

试试这个:

marketdata.rdd.map(symbolize).reduceByKey{ case (symbol, days) => days.sliding(5).map(makeAvg)  }.foreach{ case (symbol,averages) => averages.save() }

其中symbolize占用一行符号x天并返回一个元组(符号,日)。

对于答案的第一部分,我不同意Carlos。 程序不在驱动程序中运行(“master”)。

循环确实按顺序运行,但对于每个符号执行:

marketData.filter(symbol).rdd.sliding(5).map(...calculating the avg...).save()

并行完成,因为markedData是Spark DataFrame并且是分布式的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM