hive和kudu数据之间的互相迁移存在的坑
一、为什么要进行数据迁移
背景:我现在有个需求:需要修改kudu表的主键,主键由1个字段增加为2个字段。因为不能影响下游系统使用kudu表,kudu表表名不能做修改。需要将原kudu表删除后再建新kudu表。
这里存在几个潜在知识点:
1.kudu表修改主键不能使用命令直接修改,必须重新删表然后建表才能进行后续程序操作。
2.使用hive作为中间表是为了数据落在hive中没有主键的概念,然后可以有选择性的落在新kudu表中。
3.kudu表建表语句中的主键字段必须在非主键字段前,否则报建表失败错误。
二、数据迁移的流程
1.旧kudu表数据迁移至hive表中,并检查旧kudu表和hive表的数据量是否相同。
2.删除旧kudu表,创建新kudu表。
3.hive表数据迁移至新kudu表中,并检查新kudu表和hive表的数据量是否相同。
三、迁移过程存在的坑
我的新旧kudu表的表结构前后不一致,主要是因为新加入主键的字段在旧表中的位置是第3个(旧kudu表中主键是第1位)。根据kudu表建表语句的特性,在新kudu表中需要将主键字段排在非主键字段前,所以新kudu表的表结构需要有所变化。
因为上述前提条件:我原先使用的迁移SQL是:insert into newKuduTable select * from hiveTable;
我原以为在hive数据迁移至kudu的过程中,hive底层会根据字段名进行一一映射,这样我只用创建好kudu表的表结构,hive会根据字段名去迁移数据。
但是在我检查数据kudu和hive的数据时发现,我的hive表数据量是220条(和旧kudu表中数据一致),但是我的hive表数据量突增至8500多条。并且我随机抽样新kudu查里面的数据时,在hive中找不见对应的数据。后来我将上述SQL语句修改为以下:insert into newKuduTable select pk1,pk2.col1,col2,... from hiveTable;
后,数据可以正常落入新kudu表中,并且抽样新kudu表中数据和hive表中数据一致。
四、总结
1.存在上面的坑和解决过程,说明数据迁移过程不能想当然,必须实测一下才能发现问题。
2.hive表数据往kudu表中迁移时,如果两张表的表结构不同,hive底层是不会根据字段去自动调整数据的落入的,而是严格按照列一一映射落入的,这就导致了因为数据格式或者数据类型的不一致导致数据突增,出现上面的问题。
至此,问题圆满结束,又水了一篇博客~~~