问题:sqoop allowinsert模式只插入没有更新
原因:当sqoop,update的时候是需要知道update谁的,如果你的表主键会变或者没有主键 都将使update失败。
例如:
原表mysql:
id | code | no | name |
---|---|---|---|
303swngennwe1nig3wonf | 1010 | 11zz | 张三 |
数据更改后(hive中)(注意,张三名字变了的同时id也变了)
id | code | no | name |
---|---|---|---|
300swngennwe1nig30000 | 1010 | 11zz | 张三test |
303swngennwe1nig3haef | 1012 | 11dd | 李四 |
将更改后数据sqoop 导入回原表sqoop --update-key code,no --update-mode allowinsert
以code、no为去重标识,id可能会变,则结果为下表:
id | code | no | name |
---|---|---|---|
303swngennwe1nig3wonf | 1010 | 11zz | 张三 |
300swngennwe1nig30000 | 1010 | 11zz | 张三test |
303swngennwe1nig3haef | 1012 | 11dd | 李四 |
两条新数据已插入,但旧张三未改变。
原因就是以code、no为更新key,正常来说1010 |11zz 这条数据在原表有,此时数据不是insert进入旧表而是update,用新数据生成语句:为update 原表 set 各字段=新值 where id=300swngennwe1nig30000
注意此时id是新数据1010 |11zz这条的id,而原表中不存在该id:300swngennwe1nig30000,所以id为303swngennwe1nig3wonf 数据没有被更新,更新失败sqoop以insert方式插入新数据。