通过索引关联RDD中的两个数组

时间:2018-02-04 18:28:01

标签: arrays scala apache-spark rdd

我有一个RDD,每行RDD[(Array[Int], Array[Double])]包含两个数组。对于每一行,这两个数组的大小相同n。但是,每行的n大小不同,n最多可达200​​.示例数据如下:

(Array(1, 3, 5), Array(1.0, 1.0, 2.0))
(Array(6, 3, 1, 9), Array(2.0, 1.0, 2.0, 1.0))
(Array(2, 4), Array(1.0, 3.0))
. . .

我想根据每行的索引在这两个数组之间进行组合。因此,预期产出如下:

((1,1.0), (3,1.0), (5,2.0))
((6,2.0), (3,1.0), (1,2.0), (9,1.0))
((2,1.0), (4,3.0))

这是我的代码:

val data = spark.sparkContext.parallelize(Seq( (Array(1, 3, 5),Array(1.0, 1.0, 2.0)), (Array(6, 3, 1,9),Array(2.0, 1.0, 2.0, 1.0)) , (Array(2, 4),Array(1.0, 3.0)) ) )
val pairArr = data.map{x =>
  (x._1(0), x._2(0))
}
//pairArr: Array((1,1.0), (6,2.0), (2,1.0))

此代码仅获取每行中第一个索引的值。
任何人都可以指导我如何获得预期的产量?

感谢。

1 个答案:

答案 0 :(得分:2)

你需要data.map(x => x._1.zip(x._2)).collect // res1: Array[Array[(Int, Double)]] = Array(Array((1,1.0), (3,1.0), (5,2.0)), Array((6,2.0), (3,1.0), (1,2.0), (9,1.0)), Array((2,1.0), (4,3.0))) 每个元组中的两个元素:

data.map{ case (x, y) => x.zip(y) }.collect
// res0: Array[Array[(Int, Double)]] = Array(Array((1,1.0), (3,1.0), (5,2.0)), Array((6,2.0), (3,1.0), (1,2.0), (9,1.0)), Array((2,1.0), (4,3.0)))

或者使用模式匹配:

class ChampionDaoTests {
    var chmpDao : IChampionDao? = null

    val chmp1 = TestHelper.generateChampionObj()
    val chmp2 = TestHelper.generateChampionObj()

    @Before
    fun before() {
        // Should be rolled back after each Test case
        chmpDao = ChampionDao(TestHelper.getEntityManager())
        (this.chmpDao as ChampionDao).saveChampion(chmp1)
        (this.chmpDao as ChampionDao).saveChampion(chmp2)
    }

    @Test
    fun testFindAllMethod() {
        val chmps : List<Champion> = this.chmpDao!!.findAllChampions()
        assertTrue { chmps.size == 2 }
    }

    @Test
    fun testFindChampionMethod() {
        val chmp = this.chmpDao!!.findChampionById(chmp1.chmpid!!)
        assertNotNull(chmp)
        if (chmp != null) {
            assertTrue { chmp.equals(chmp1) }
        }
    }

    @Test
    fun testFindChampionMethodWrongParam() {
        val chmp = this.chmpDao!!.findChampionById(-1)
        assertNull(chmp)
    }
}