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底層是不會根據字段去自動調整數據的落入的,而是嚴格按照列一一映射落入的,這就導致了因為數據格式或者數據類型的不一致導致數據突增,出現上面的問題。
至此,問題圓滿結束,又水了一篇博客~~~

浙公網安備 33010602011771號