PySpark:从现有的 LabeledPointsRDD 创建新的 RDD 但修改标签

PySpark: creating new RDD from existing LabeledPointsRDD but modifying the label

有没有一种快速的方法可以从包含 LabeledPoints 的现有 RDD 创建新的 RDD,但只修改每一行的标签?

举个例子,假设我有一个名为 myRDD 的 RDD,并且 myRDD 有如下 LabeledPoints:

RDD = sc.parallelize([
    LabeledPoint(1, [1.0, 2.0, 3.0]),
    LabeledPoint(2, [3.0, 4.0, 5.0]),
    LabeledPoint(4, [6.0, 7.0, 8.0])])

这表示 RDD 的 take(5)。

我只想从这个创建一个新的 RDD,但我想从每个标签中减去 10。

当我尝试这个时,它惨遭失败:

myRDD = RDD.map(lambda x: x[0].label - 10, x[1].features)

请帮助我指出我在上述尝试中的推理有什么问题。

what is wrong with your reasoning in above attempt?

先来看一张全图:

 map(lambda x: x[0].label - 10, x[1].features)

现在它被解释为 map,函数 lambda x: x[0].label - 10 和一些额外的参数 x[1].features。让我们从返回一个元组开始:

map(lambda x: (x[0].label - 10, x[1].features)))

传递给 map 的函数当时接收一个点,因此索引没有意义,您应该简单地访问 labelfeatures:

 map(lambda x: (x.label - 10, x.features))

最后你必须创建一个新点:

map(lambda x: LabeledPoint(x.label - 10, x.features))