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

Posted

技术标签:

【中文标题】PySpark:从现有的 LabeledPointsRDD 创建新的 RDD,但修改标签【英文标题】:PySpark: creating new RDD from existing LabeledPointsRDD but modifying the label 【发布时间】:2015-07-19 09:37:24 【问题描述】:

有没有一种快速的方法可以从包含 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 创建一个新的 RDD,但我想从每个标签中减去 10。

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

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

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

【问题讨论】:

【参考方案1】:

您在上述尝试中的推理有什么问题?

首先让我们看一下整个地图:

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

【讨论】:

谢谢先生!为了我的理智 - 为什么我必须重新创建为 LabeledPoint - RDD 已经创建,每一行都是 LabeledPoint,因此我认为我可以更改标签值并保持 RDD 的“labeledpointedness”?难道仅仅是我通过地图应用某种形式的操作需要这种显式的重新标签指向吗? 几乎你在 Spark 中使用的所有数据结构都是不可变的。即使不是匿名函数也不适合改变状态,尤其是当你必须使用语句时。

以上是关于PySpark:从现有的 LabeledPointsRDD 创建新的 RDD,但修改标签的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache Spark (PySpark 1.4.1) 中可视化/绘制决策树?

如何从现有的远程分支创建本地分支?

从现有的 JAVA Spring API 生成 YAML 文件

从现有的 docker 容器中删除端口绑定

从现有的 Xcode 项目制作 CocoaPod

从现有的 SwiftUI @States 派生绑定