sqoop从hive导入数据到mysql时出现主键冲突
今天在将一个hive数仓表导出到mysql数据库时出现进度条一直维持在95%一段时间后提示失败的情况,搞了好久才解决。使用的环境是HUE中的Oozie的workflow任何调用sqoop命令,该死的oozie的日志和异常提示功能太辣鸡了,最后发现是重复数据导致数据进入mysql表时出现主键冲突进而导致数据同步失败。
(1)众所周知hive表是没有主键与索引的,但是mysql的表一般在创建时就会指定主键,所以在把hive表中的数据导入mysql表的时候通常会使用原hive表中的多个字段构成联合主键,这几个主键字段的值必须能唯一地标识表中的每一条记录,也即导入数据的这几个字段的联合值不能出现重复值。
比如下面这张mysql表中主键由5个字段构成agent_id,estate_id,event_name,action_timestamp,dt,因此在导入数据时需保证不能出现重复值。
CREATE TABLE IF NOT EXISTS tmp_shujuxiong_20190116( agent_id bigint(20) NOT NULL DEFAULT '0' comment '经纪人id', agent_true_name varchar(1000) DEFAULT NULL comment '经纪人姓名', longitude varchar(1000) DEFAULT NULL comment '用户所在经度', latitude varchar(1000) DEFAULT NULL comment '用户所在纬度', action_timestamp VARCHAR(200) NOT NULL comment '动作时间', action_date VARCHAR(200) NOT NULL comment '动作日期', event_name varchar(200) NOT NULL comment '事件名称', estate_id bigint(20) NOT NULL comment '楼盘id', estate_name varchar(1000) DEFAULT NULL comment '楼盘名称', estate_developer_name varchar(1000) DEFAULT NULL comment '楼盘开发商名称', estate_developer_brand_name varchar(1000) DEFAULT NULL comment '楼盘开发商品牌', load_job_number varchar(1000) DEFAULT NULL comment '数据仓库调度工具oozie job单次运行id, 使用oozie EL function: ${wf:id()}', load_job_name varchar(1000) DEFAULT NULL comment '数据仓库调度工具oozie_job名称: 使用oozie EL function: ${wf:name()}', insert_timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '数据仓库数据插入时间', source_system_code INT(11) comment '数据仓库的源系统数据分类:1-二手房;2-新房;3-金融;4-租房', dt varchar(8) NOT NULL comment '分区字段', PRIMARY KEY (agent_id,estate_id,event_name,action_timestamp,dt), KEY agent_id (agent_id) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT 'XXX接口数据' ;
(2)另一个需要注意的问题的是字段类型与字段长度,hive的数据类型与mysql的数据不完全相同,因此mysql中创建表的时候需要特别注意字段的类型与长度。
(3)可以在hive表中使用一个自增字段起到类似主键的作用,以便于在hive和mysql间进行数据同步,确保数据同步时不发生主键冲突。
如下面这段HQL脚本中可以使用自增序号字段起到主键的作用,在其他字段组合不能保证数据唯一性的时候
alter table tmp_table_name drop if exists partition (dt = '${dt}'); alter table tmp_table_name add if not exists partition (dt = '${dt}'); insert overwrite table tmp_table_name partition(dt = '${dt}') select row_number()over() as row_number -- 自增序号 , id ... from ...
sqoop从hive导入数据到mysql时出现主键冲突的更多相关文章
- mysql 主从,主主,主主复制时的主键冲突解决
原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...
- insert时出现主键冲突的处理方法【转载】
原文出处:http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html 使用"insert into"语句进行 ...
- insert时出现主键冲突的处理方法
使用"insert into"语句进行数据库操作时可能遇到主键冲突,用户需要根据应用场景进行忽略或者覆盖等操作.总结下,有三种解决方案来避免出错. 测试表:CREATE TABLE ...
- mysql主从之主键冲突
收到短信报警,两台数据库都报slave同步失败了,先说明一下环境,架构:lvs+keepalived+amoeba+mysql,主主复制,单台写入, 主1:192.168.0.223(写) 主2:19 ...
- mysql插入报主键冲突,解决方法主键索引重新排序
1.备份表结构 create table table_bak like table_name; 2.备份表数据 insert into table_bak select * from table_na ...
- mysql主从:主键冲突问题
1.检查从库 show slave status \G; Slave_IO_Running: YesSlave_SQL_Running: No 2.出现类似如下的报错: Last_SQL_Error: ...
- Entity Framework中Remove、Modified实体时,在修改或删除时引发主键冲突的问题
问题: try { string fileId = context.NewsT.Where(t => t.Id == Model.Id).FirstOrDefault().FileId; str ...
- 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...
- Sqoop导入数据到mysql数据库报错:ERROR tool.ExportTool: Error during export: Export job failed!(已解决)
问题描述: Container killed by the ApplicationMaster. Container killed on request. Exit code is 143 Conta ...
随机推荐
- SpringMVC(三):参数绑定、输入输出转换
一.参数解析绑定 1. 自定义绑定:不绑定某些项 @InitBinder private void initBinder(WebDataBinder dataBinder) { dataBinder. ...
- 【Oracle】使用bbed手动提交事务
有时候数据库挂掉,起库会出现ORA-00704错误,而导致ORA-00704错误的根本原因是訪问OBJ$的时候.ORACLE须要回滚段中的数据,而訪问回滚段的时候须要的undo数据已经被覆盖,此时我们 ...
- 前端框架之Vue(10)-全家桶简单使用实例
vue-router官方文档 vuex官方文档 安装 npm install vue-router --save 使用实例 vue-router初使用(webpack-simple模板) 1.切换到指 ...
- 小程序编辑器vscode
安装中文版 1)打开vscode工具: 2)使用快捷键组合[Ctrl+Shift+p],在搜索框中输入“configure display language”,点击确定后: 3)如图所示 =>安 ...
- python线程中的join(转)
Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一:当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多 ...
- update moudle 调用方式
向数据库中添加数据 ztt_teacher 1: 创建一个 function moudle,设置该moudle类型为 update moudle 2: 向数据库添加数据的代码 FUNCTION ...
- PHP策略模式1
[IUser.php] <?php /** * 策略模式 * 将一组特定的行为和算法封装成类,用来适应某些特定的上下文环境,实现从硬编码到解耦 * 应用举例:电商系统针对不同性别跳转到不同的商品 ...
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- jsonServer 造个假的服务器传递数据接口 再用axois来请求数据
- 《全栈性能Jmeter》-7JMeter常用脚本开发