每行加入两个不同的RDD - Scala

Posted

技术标签:

【中文标题】每行加入两个不同的RDD - Scala【英文标题】:Join per line two different RDDs in just one - Scala 【发布时间】:2017-11-02 23:36:48 【问题描述】:

我正在使用 Spark-Scala 编写 K-means 算法。 我的模型预测每个点在哪个簇中。

数据

-6.59 -44.68
-35.73 39.93
47.54 -52.04
23.78 46.82
....

加载数据

val data = sc.textFile("/home/borja/flink/kmeans/points")
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()

使用 KMeans 将数据聚类到两个类中

val numClusters = 10
val numIterations = 100
val clusters = KMeans.train(parsedData, numClusters, numIterations)

预测

val prediction = clusters.predict(parsedData)

但是,我需要将结果和点放在同一个文件中,格式如下:

[no title, numberOfCluster (1,2,3,..10), pointX, pointY]:
    6 -6.59 -44.68
    8 -35.73 39.93
    10 47.54 -52.04
    7 23.78 46.82

这是this executable在Python中的输入,打印出非常好的结果。

但我尽最大努力做到了这一点: (您可以检查第一个数字是否错误:68、384、...)

var i = 0
val c = sc.parallelize(data.collect().map(x => 
    val tuple = (i, x)
    i += 1
    tuple
))
i = 0
val c2 = sc.parallelize(prediction.collect().map(x => 
    val tuple = (i, x)
    i += 1
    tuple
))
val result = c.join(c2)

result.take(5)

结果:

res94: Array[(Int, (String, Int))] = Array((68,(17.79 13.69,0)), (384,(-33.47 -4.87,8)), (440,(-4.75 -42.21,1)), (4,(-33.31 -13.11,6)), (324,(-39.04 -16.68,6)))

感谢您的帮助! :)

【问题讨论】:

【参考方案1】:

我没有方便测试的火花集群,但这样的东西应该可以工作:

val result = parsedData.map  v =>
  val cluster = clusters.predict(v)
  s"$cluster $v(0) $v(1)"

result.saveAsTextFile("/some/output/path")

【讨论】:

它完全解决了我的问题,所以非常感谢! :)

以上是关于每行加入两个不同的RDD - Scala的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 基于 Spark 中的键合并两个 RDD

连接来自两个不同数据库的 RDD

加入两个流水线RDD

加入两个产生空数据的 RDD

Spark in Python Working with Tuples - 如何在加入两个 RDD 后合并两个元组

如何通过一个键加入两个 RDD? [复制]