对于外键约束,Sqoop导出失败

时间:2016-06-15 14:32:40

标签: mysql hive sqoop

我在hive中有一个表A(从mysql中获取转储),其中包含以下行,第一列是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。

如何编写一个hive查询,它只会选择表B中那些在父表中有起始值和结束值的记录?

或者在使用SQOOP导入之前还有其他方法可以在mysql中禁用FK吗?

我尝试通过在mysql中设置FOREIGN_KEY_CHECKS = 0来禁用FK,但SQOOP作业仍然失败。

儿童表:     CREATE TABLE edges(       start bigint(20)NOT NULL,       type int(11)NOT NULL,       end bigint(20)NOT NULL,       base_strength float DEFAULT NULL,       updated datetime DEFAULT NULL,       db_updated datetime DEFAULT NULL,       独特的钥匙lookupstarttypeend),       独特的钥匙reverse_lookupendtypestart),       约束edges_ibfk_1外键(start)参考nodesid),       约束edges_ibfk_2外键(end)参考nodesid)     )ENGINE = InnoDB DEFAULT CHARSET = latin1;

父表

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;

1 个答案:

答案 0 :(得分:0)

可以通过两种方式完成。

删除FOREIGN约束,

加载数据和

重新创建约束。

使用

禁用约束

SET foreign_key_checks = 0;

插入您的数据

SET foreign_key_checks = 1;