hive和kudu数据之间的互相迁移存在的坑

发布时间 2023-03-22 21:16:33作者: 贾彤

一、为什么要进行数据迁移

背景:我现在有个需求:需要修改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底层是不会根据字段去自动调整数据的落入的,而是严格按照列一一映射落入的,这就导致了因为数据格式或者数据类型的不一致导致数据突增,出现上面的问题。

至此,问题圆满结束,又水了一篇博客~~~