分享

hive中delete删除慢解决办法

zhuqitian 发表于 2017-5-10 10:02:31 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 11442
应该是有一些公司的部分业务系统是用的这种方式做数据处理或者报表展现的:
jdbc连接hive,在java代码中嵌套hql,跟传统的关系型数据库一样的操作,比如一个订单被用户取消了,那么这个需要实时的更新,
不能到配货系统中,在hive中也使用delete from table_name where order_id = '' ;即使数据量不大,也得个十几秒吧
这边就碰到过这个问题,删除一条数据需要30多秒,甚至一分钟,如果系统再出现个卡顿,真的就配货了

调整思路:按照order_id取模分区,eg:order_id / 10000 as pt_id
然后使用insert overwrite table orders (pt_id) select ******,order_id / 10000 as pt_id from orders
一个分区1万条,也就5-10兆
insert overwrite table (pt_id=$partition_id)
select ***** from orders
where  pt_id=$partition_id and order_id <> '';
前提是事先知道是在哪个分区下,这个就很简单了,执行前做个判断,同样的按10000取个模,传参就行
即使是走磁盘,5-10兆的数据量,也是1-2秒可以搞定,这种延时其实都可以接受

另一种调整思路:(只在构思阶段)
在用户下单时这个数据不马上插入订单表,有个时间间隔,比如10分钟,10分钟内如果用户取消了订单,直接在内存中清掉这条数据即可,即使是张
临时表也很方便清理,然后10分钟的订单批量插入订单表,再过一定时间再把这批数据发给配货单系统,至于时间临界点问题难以避免,但是这种
方法已经可以减少操作表的频率,删除其实也是一样,可以有一定间隔时间,in删除语法一样高效

数据量特别大,就要考虑分库分表了,一个好的设计思路可以事半功倍!
show your knowledge with the world!

已有(2)人评论

跳转到指定楼层
qcbb001 发表于 2017-5-10 13:16:34
第二种类似hbase的缓存,达到一定的量或则按照时间,然后在插入。也就是在下单短时间内,用户操作的可能性比较大。过了这个时间后,就不频繁操作了。
回复

使用道具 举报

zhuqitian 发表于 2017-5-10 14:28:09
qcbb001 发表于 2017-5-10 13:16
第二种类似hbase的缓存,达到一定的量或则按照时间,然后在插入。也就是在下单短时间内,用户操作的可能性 ...

这么设计更合理些,减少资源开销
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条