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 的函数当时接收一个点,因此索引没有意义,您应该简单地访问 label
和 features
:
map(lambda x: (x.label - 10, x.features))
最后你必须创建一个新点:
map(lambda x: LabeledPoint(x.label - 10, x.features))
有没有一种快速的方法可以从包含 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 的函数当时接收一个点,因此索引没有意义,您应该简单地访问 label
和 features
:
map(lambda x: (x.label - 10, x.features))
最后你必须创建一个新点:
map(lambda x: LabeledPoint(x.label - 10, x.features))