【问题标题】:Create a mapped RDD and save it in text创建一个映射的 RDD 并将其保存为文本
【发布时间】:2017-09-08 08:14:41
【问题描述】:

我运行了一个 K-means 示例,并且我有一个 RDD,其中包含名为 parsedData 的数据 我的模型命名为集群。我想用模型中的数据点和预测集群创建一个映射的 Rdd。所以我尝试了

val predictions = parsedData.map( point => 
{
val pointPred = clusters.predict(point) 
Array(point,pointPred)
})

当我尝试时

 predictions.first()

我接受

Array[Any] = Array([0.8898668778942382,0.89533945283595], 0)

这是我想要的结果。所以我尝试了

predictions.saveAsTextFile ("/../ClusterResults");

将每个数据点的数组保存在本地文件中,但创建的文件是

[Ljava.lang.Object;@3b43c55c

[Ljava.lang.Object;@5e523969

[Ljava.lang.Object;@68374cdf ....

有对象而不是数据。我也尝试从 RDD 中打印,例如

predictions.take(10).map(println)

并再次将对象作为结果。 如何获取数据而不是对象并将它们保存到本地文件?

【问题讨论】:

  • 使用predictions.saveAsTextFile。
  • 另外,你需要mkString那些数组
  • 所以我编辑了我的代码我做了我们 saveAsTextFile 并采取了 Ljava.lang.Object;@3b43c55c ....
  • 那么,不要使用数组。使用元组
  • 在我的地图中?像 .map(point =>(point, cluster.predict(point)))

标签: scala file apache-spark distributed-computing apache-spark-mllib


【解决方案1】:

问题在于您映射数据的方式。尝试使用 Tuple,而不是 Array。

例子:

val predictions = parsedData.map( point => {
  (point, clusters.predict(point))
})

【讨论】:

  • 谢谢你我试过这个并且工作正常。但我的问题仍然在于为什么 first() 打印数组而不是对象?以及如何使用 Array 来实现,我可以将对象中的 Array 解析为字符串吗?
  • 我认为因为它有一个数组@MichailN ..也许,但我不确定!很高兴我提供了帮助。
  • saveAsTextFile 的文本文件中的输出只是调用了 Object 的 toString 方法。在这种情况下 Array.toString 输出就像你看到的那样:[Ljava.lang.Object;@3b43c55
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多