[英]Apache Spark filter elements
我有兩個RDD: points
和pointsWithinEps
。 其內容如下圖:
向量表示x, y
坐標。 pointsWithinEps
代表兩個點以及它們之間的距離。 我想循環所有points
並且對於每個點過濾器,僅將pointsWithinEps
中的pointsWithinEps
作為x
(第一個)坐標。 因此,對於第一點,它將從pointsWithinEps
給出[0]
和[1]
向量。 我有以下代碼:
for (i <- 0 until points.count.toInt) {
val p = points.take(i + 1).drop(i)
val currentPointNeighbours = pointsWithinEps.filter {
case ((x, y), distance) =>
x == p
}
currentPointNeighbours.foreach(println)
println("----")
}
它不能正常工作。 代碼有什么問題?
如果將RDD轉換為KV RDD,然后在鍵上進行聯接,則可以有效地做到這一點。 對於點,關鍵是點本身,對於距離,關鍵是第一點
import org.apache.spark.SparkContext._
type Point = DenseVector
type Distance = ((Point, Point), Double)
val points: RDD[Point] = ???
val pointsWithinEps: RDD[Distance] = ???
// Prepare Tuple2 RDD to enable spark tuple functions
val pointsToKV: RDD[(Point, Unit)] = points.map(p => p -> ())
val distance: RDD[(Point, Distance)] = pointsWithinEps.map(distance => distance._1._1 -> distance)
// Join points with distance
val filtered: RDD[Distance] = pointsToKV.join(distance) map (_._2._2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.