今天在将一个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时出现主键冲突的更多相关文章

  1. mysql 主从,主主,主主复制时的主键冲突解决

    原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...

  2. insert时出现主键冲突的处理方法【转载】

    原文出处:http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html 使用"insert into"语句进行 ...

  3. insert时出现主键冲突的处理方法

    使用"insert into"语句进行数据库操作时可能遇到主键冲突,用户需要根据应用场景进行忽略或者覆盖等操作.总结下,有三种解决方案来避免出错. 测试表:CREATE TABLE ...

  4. mysql主从之主键冲突

    收到短信报警,两台数据库都报slave同步失败了,先说明一下环境,架构:lvs+keepalived+amoeba+mysql,主主复制,单台写入, 主1:192.168.0.223(写) 主2:19 ...

  5. mysql插入报主键冲突,解决方法主键索引重新排序

    1.备份表结构 create table table_bak like table_name; 2.备份表数据 insert into table_bak select * from table_na ...

  6. mysql主从:主键冲突问题

    1.检查从库 show slave status \G; Slave_IO_Running: YesSlave_SQL_Running: No 2.出现类似如下的报错: Last_SQL_Error: ...

  7. Entity Framework中Remove、Modified实体时,在修改或删除时引发主键冲突的问题

    问题: try { string fileId = context.NewsT.Where(t => t.Id == Model.Id).FirstOrDefault().FileId; str ...

  8. 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误

    1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...

  9. 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 ...

随机推荐

  1. swift中 ?和 !的区别

      可选类型(?)与强制解析运算符(!) ?是一种判断后再拆包的语法糖 !是一种强制拆包的语法糖   当你不确定有值的时候就可以用  ? 当你确定有值的时候可以用  !     ?的几种使用场景:1. ...

  2. jquery中$.get()提交和$.post()提交的区别

    相同点:都是异步请求的方式来获取服务器端的数据: 异同点: 1.请求方式不同:$.get()方法使用 GET 方法来进行异步请求的:$.post()方法使用POST方法来进行异步请求的: 2.参数传递 ...

  3. 8.1-uC/OS-III多任务应用

    1.app.c: ( 1) .分别为每个任务分配一个OS_TCB. (2). 斥信号量( mutex)是一个内核对象(一个结构体),用于保护共享资源.任务要访问共享资源就必须先获得 mutex. mu ...

  4. Linksys E 刷Tomato shibby

    前言 一直以来都用Linksys的无线路由器~因为它的稳定~多年来一直用Linksys自身的固件~因为之前没用它做什么特别的应用~所以一直用了下来~它的原厂固件的稳定性也从没让我操过心~近来要为用户提 ...

  5. Redis入门到高可用(一)——初识Redis

    一.Redis是什么 * 开源 * 基于键值的存储服务系统 * 支持多种数据结构 * 高性能,功能丰富 二.Redis特性 ♦️ 概述 * 速度快 * 支持持久化 * 支持多种数据结构 * 支持多种编 ...

  6. golang 的 math/big 进行

    进行高进度运算的时候unint64已经无法满足需求,这个时候大家可以采用math.big库来进行高进度计算,下面以计算第10000位的菲波纳切数来展示big的用法,代码如下: package main ...

  7. 华为核心交换机绑定IP+MAC+端口案例

    1         案例背景 某网络改造项目,核心交换机为华为S5700,接入交换机为不同型号交换机,如下模拟拓扑,客户端接入交换机1通过Access模式与核心交换机连接,该交换机下只有一个Vlan2 ...

  8. sap component 导航 链接

    1: 定义一个导航链接名字,这个名子如果在程序中遇到(该名字会在程序中使用),就会触发这样一个导航. 导航有两个view,一个原来的view,一个出发abc之后的target view,也就是目标视图 ...

  9. 日志文件系统syslog,syslog-ng

    日志文件系统syslog,syslog-ng   余二五 2017-11-07 20:37:00 浏览127 评论0 日志 LOG 配置 主机 正则表达式 syslog 表达式 source file ...

  10. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...