2015-07-19 35 views
3

是否有一种快速方法从包含LabeledPoints的现有RDD创建新的RDD,但仅修改每行的标签?PySpark:从现有的LabeledPointsRDD创建新的RDD,但修改标签

作为一个例子,假设我有RDD称为myRDD,并且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的取(5)。

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

当我尝试这一点,悲惨的失败了:

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

请通过也指出了什么是错的我在上面尝试推理帮助我。

回答

2

你在上述尝试中的推理出了什么问题?

首先让我们来看看在整个地图:

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))) 

功能传递到地图接收在单个时间点,以便建立索引是没有意义的,你应该简单地acceess labelfeatures

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

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

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

谢谢先生!为了我的理智 - 为什么我必须重新创建LabeledPoint - RDD已经创建,每行都是LabeledPoint,因此我认为我可以更改标签值并保持RDD的“标记目标”?这是否仅仅是事实,我应用某种形式的操作通过地图,这需要明确的重新标记点? – Monty

+0

几乎每个你在Spark中使用的数据结构都是不可变的。即使它不是匿名函数,也不是一个改变状态的正确位置,特别是如果你必须使用语句。 – zero323

相关问题