1## 标题:背景从kafka出来的数据然后根据数据中的一个字段判断是插入\更新\删除数据
首要前提:从kafka来的一批数据其中有可能对这一条数据有好几种操作,所以这需要保证有序、
1 首先想法是把所有的数据分到一个分区然后这样可以保证全局有序,但是这样数据量变大就不可以使用了
2 第二种想法是多分区排序,然后在collect也可以保证全局有序,但是可能会driver压力会很大
例:object SparkSortByApplication {
def main(args: Array[String]): Unit = {
1
val conf = new SparkConf().setAppName(“SortSecond”).setMaster(“local[1]”)
val sc = new SparkContext(conf)
val arr = Array((1, 6, 3), (2, 3, 3), (1, 1, 2), (1, 3, 5), (2, 1, 2))
val datas2 = sc.parallelize(arr)
val sorts2 = datas2.sortBy(e => (e._1,e._2))
sorts2.collect().foreach(println)
sc.stop()
}
}
3 第三种想法可以解决这种问题
1 首先我们根据数据中的 (主键=value)
2 然后将这个(主键=value) 作为rdd的key
3 最后我们根据这个key对其进行重分区就可以吧这个批数据对同一个数据操作的数据放到同一个分区中,此时对同一个数据操作的数据全部在同一个分区
4 然后我们在用mapPartitions算子对其分区中数据排序
例:
val arr = Array((1, 6), (2, 3), (1, 1), (1, 3), (2, 1))
val datas2 = sc.parallelize(arr)
val sorts2 = datas2.mapPartitions(x =>
{
//此时x是迭代器,scala中的集合可以用sortby进行排序
val y = x.toList.sortby(x => x._1)
//此时每个分区的排序完成返回
y.iterator
})
//java代码我没有找到集合可以使用排序kv的
所以在用了mapPartitions后我们可以用下冒泡排序来解决然后返回迭代器