簡體   English   中英

Spark:根據另一個RDD中的數組元素獲取RDD的元素

[英]Spark: Get elements of an RDD based on the elements of an array in another RDD

在Spark Scala框架中,我有一個RDD rdd1 ,其中每個元素代表矩陣A的單個元素:

val rdd1 = dist.map{case (((x,y),z,v)) => ((x,y),v)}

x代表行, y代表列, v代表矩陣A的值。

我還有另一個RDD rdd2 ,形式為RDD[index, Array[(x, y)]] ,其中每個元素中的數組代表矩陣A的元素集,存儲在rdd1 ,該元素中表示的特定index

現在,我需要做的是獲取每個index的矩陣A元素的index ,並保留包括index(x,y)v所有數據。 什么是這樣做的好方法?

如果我理解正確,那么您的問題可以歸結為:

val valuesRdd = sc.parallelize(Seq(
//((x, y), v)
  ((0, 0), 5.5),            
  ((1, 0), 7.7)
))

val indicesRdd = sc.parallelize(Seq(
//(index, Array[(x, y)])
  (123, Array((0, 0), (1, 0))) 
))

並且您想要合並這些RDD以獲取所有值(index, (x, y), v) ,在這種情況下為(123, (0,0), 5.5)(123, (1,0), 7.7)

您絕對可以使用join來執行此操作,因為兩個RDD都有一個公用列(x, y) ,但是由於其中一個實際上具有Array[(x, y)] ,因此必須首先將其分解為一組行:

val explodedIndices = indicesRdd.flatMap{case (index, coords: Array[(Int, Int)]) => coords.map{case (x, y) => (index, (x, y))}}
// Each row exploded into multiple rows (index, (x, y))

val keyedIndices = explodedIndices.keyBy{case (index, (x, y)) => (x, y)}
// Each row keyed by the coordinates (x, y)

val keyedValues = valuesRdd.keyBy{case ((x, y), v) => (x, y)}
// Each row keyed by the coordinates (x, y)

// Because we have common keys, we can join!
val joined = keyedIndices.join(keyedValues)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM