[英]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.