从scala元组数组创建Bin

时间:2015-02-24 16:52:25

标签: scala apache-spark

我有一个格式元组数组

Input: Array[(Long,Double)]
arr = Array[(1,3),(2,5),(3,9),(4,10),(5,3)]

现在我想对数据进行一些分类。这是我遵循的算法:

  1. 我在第二个参数
  2. 上排序数组
  3. 将第一个元素指定为bin 0
  4. 如果下一个元素与之前的元素相同,那么它会进入相同的bin,否则我会继续增长一个bin,直到达到指定的大小,比如整个数据的10%
  5. 当bin大小超过指定大小时,将创建一个新bin。

    If bin size is assumed to be 1
    Output: Array[(1,0),(5,0),(2,1),(3,2),(4,3)]
    
  6. 目前,我可以通过列表中的简单迭代将每个值与之前的值进行比较,并跟踪箱尺寸。是否有任何有效的方法来实现这一点,尤其是在scala中?

1 个答案:

答案 0 :(得分:1)

嗯..让我们说你知道箱子的大小(你可以得到箱子的数量)或箱子的数量。

val numBins = 3

val arr = Array[(1,3),(2,5),(3,9),(4,10),(5,3)]

// sc is the SparkContext
val arrRdd = sc.parallelize( arr )

val sortedRdd = arrRdd.sortBy( ( t: ( Int, Int) ) => t._2 )

val binnedRdd = sortedRdd.repartition( numBins ).glom

现在,binnedRdd将为RDD[ Array[ (Int, Int) ] ],其中每个数组都是您的bin。