假设有以下地图缩减作业
映射:
setup()初始化一些状态
map()将数据添加到状态,无输出
cleanup()输出状态到上下文
减速机:
将所有州聚合成一个输出
如何在火花中实施这样的工作?
补充问题:如何在烫伤中实施此类工作? 我正在寻找以某种方式使方法超载的例子......
答案 0 :(得分:2)
Spark map
未提供等效的Hadoop setup
和cleanup
。它假设每个呼叫都是独立的,并且没有副作用。
您可以获得的最接近的等价物是将所需的逻辑放在mapPartitions
或mapPartitionsWithIndex
内,并使用简化的模板:
rdd.mapPartitions { iter => {
... // initalize state
val result = ??? // compute result for iter
... // perform cleanup
... // return results as an Iterator[U]
}}
答案 1 :(得分:1)
在scala中设置的标准方法是使用lazy val:
public class BarfException : GrossException
{
public BarfException() : base() { }
protected BarfException(SerializationInfo info, StreamingContext context) : base(info, context) { }
public override string Message { get { return "BARF!!"; } }
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("OverriddenMessage", Message);
}
}
只要lazy val someSetupState = { .... }
data.map { x =>
useState(someSetupState, x)
...
可以在任务上实例化(即它不使用提交节点的某个本地磁盘),上述工作就可以了。这不涉及清理。对于清理,烫伤有一个方法:
someSetupState
最后在每个任务上运行。与映射示例类似,您可以执行关闭:
TypedPipe[T]#onComplete(fn: () => Unit): TypedPipe[T]
我不知道火花的等价物。