向RDD添加新成员

时间:2015-04-26 22:05:47

标签: apache-spark rdd

我正在研究一个研究项目,我正在修改Spark的某些方面以实现我的最终目标。

我正在尝试将新成员变量添加到RDD.scala类,然后在从worker节点(执行程序)访问rdd时访问这些变量。在this回答中,一个火花贡献者提到只有RDD的某些方法可以在执行器中调用。所以,我想知道如何才能将新的成员字段添加到RDD.scala中,以便可以在执行程序中访问它?

1 个答案:

答案 0 :(得分:0)

如何将这些变量添加到RDD的Partition类中?

你知道,在spark中,任务并不直接映射到单个RDD的转换,它可能是几个RDD的组合'。因此,您希望执行程序访问的内容非常模糊,我假设您希望RDD的compute(part: Partition, context: TaskContext)方法可以访问变量,这些变量在执行程序中执行。

正如compute签名所解释的那样,它只会获得Partition& TaskContext,鉴于TaskContext与多个转换相关且对RDD透明,答案只能存在于Partition中。

Partition是在驱动程序中调用的getPartitions方法中创建的,您可以覆盖RDD的getPartitions以返回特定类型的Partition

因此,我建议的整个程序是:

  1. 创建class YourPartition(rddId: Int, idx: Int, val your_variable: Any, val your_second_variable: Any .....) extends Partition
  2. 覆盖返回def getPartitions: Array[Partition]
  3. Array[YourPartition]
  4. compute(part: Partition, context: TaskContext)中,将部分转换为YourPartition的实例,并使用您在此处创建的字段。