Vij*_*jay 0 scala apache-spark
我正在使用带scala的Spark.我想知道单行命令是否优于单独的命令?有什么好处?它在速度方面是否获得更高的效率?为什么?
例如
var d = data.filter(_(1)==user).map(f => (f(2),f(5).toInt)).groupByKey().map(f=> (f._1,f._2.count(x=>true), f._2.sum))
Run Code Online (Sandbox Code Playgroud)
反对
var a = data.filter(_(1)==user)
var b = a.map(f => (f(2),f(5).toInt))
var c = b.groupByKey()
var d = c.map(f=> (f._1,f._2.count(x=>true), f._2.sum))
Run Code Online (Sandbox Code Playgroud)
您的两个示例之间没有性能差异; 链接RDD转换或明确表示中间RDD的决定只是风格问题.Spark的惰性求值意味着在调用像take()或之类的RDD动作之前不会执行实际的分布式计算count().
在执行期间,Spark将管理尽可能多的转换.对于您的示例,Spark在映射之前不会实现整个过滤数据集:filter()并且map()转换将被流水线化并在单个阶段中执行.所述groupByKey()变换(通常)需要通过网络洗牌的数据,因此它在一个单独的阶段执行.Spark filter()只有在cache()d时才会实现输出.
如果要缓存中间RDD并对其执行进一步处理,则可能需要使用第二种样式.例如,如果我想对groupByKey()转换的输出执行多个操作,我会写类似的东西
val grouped = data.filter(_(1)==user)
.map(f => (f(2),f(5).toInt))
.groupByKey()
.cache()
val mapped = grouped.map(f=> (f._1,f._2.count(x=>true), f._2.sum))
val counted = grouped.count()
Run Code Online (Sandbox Code Playgroud)