spark处理表到表的操作,需要保证顺序

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后我们可以用下冒泡排序来解决然后返回迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值