sqoop导出外键约束失败

l7mqbcuq  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(399)

我在hive(来自mysql的dump)中有一个表a,它包含以下行,第一列是id,即pk。

1295517534, 112,    Harshal-test,   2016-04-14 10:13:32,    2016-04-15 05:17:30,    NULL,   NULL,   NULL
1295517533, 112,    "3tLMPU9Ii7ObvATtF1j6d8Hnla-15n5zMcWTDUKgC54,   2016-04-14 10:13:32,    2016-04-15 05:17:30,    NULL,   NULL,   NULL

我有另一个表b,其中包含如下所示的记录,其中第1列和第3列是开始和结束,它们都是fk引用表a的id。

1,  1,  1,  1,  2016-04-15 05:17:30,    2016-04-15 05:17:30
1295517533, 1,  1,  1,  2016-04-15 05:17:30,    2016-04-15 05:17:30
1295517533, 1,  1295517534, 1,  2016-04-15 05:17:30,    2016-04-15 05:17:30

当我尝试将这些记录导出到mysql时,sqoop作业因外键问题而失败。例如,记录1的起始值和结束值为1,但在父表中不存在;记录2的起始值在父表中存在,但结束值不存在。但由于记录3的起始值和结束值都存在于父表中,所以该行应该导出到mysql。
如何编写一个配置单元查询,只选择表b中那些在父表中有起始值和结束值的记录?
或者在使用sqoop导入之前,有没有其他方法来禁用mysql中的fk?
我尝试在mysql中设置foreign\u key\u checks=0来禁用fk,但是sqoop作业仍然失败。
子表:创建表 edges ( start bigint(20)不为空, type int(11)不为空, end bigint(20)不为空, base_strength 浮点默认为空, updated datetime default null,db\u updated datetime default null,唯一键 lookup ( start , type , end ),唯一键 reverse_lookup ( end , type , start ),约束 edges_ibfk_1 外键( start )参考文献 nodes ( id ),约束 edges_ibfk_2 外键( end )参考文献 nodes ( id ))引擎=innodb默认字符集=拉丁1;
父表

CREATE TABLE `nodes` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `postcode` varchar(4) DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  `db_updated` datetime DEFAULT CURRENT_TIMESTAMP,
  `useragent` bigint(20) DEFAULT NULL,
  `last_seen` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `akaid_index` (`type`,`name`),
  KEY `useragent_idx` (`useragent`),
  KEY `type` (`type`),
  CONSTRAINT `useragentfk` FOREIGN KEY (`useragent`) REFERENCES `useragents` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1091725696 DEFAULT CHARSET=latin1;
i1icjdpr

i1icjdpr1#

有两种方法可以做到。
删除外部约束,
加载数据和
重新创建约束。
或者
禁用约束使用
设置外键检查=0;
插入数据
设置外键检查=1;

相关问题