我在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,
独特的钥匙lookup
(start
,type
,end
),
独特的钥匙reverse_lookup
(end
,type
,start
),
约束edges_ibfk_1
外键(start
)参考nodes
(id
),
约束edges_ibfk_2
外键(end
)参考nodes
(id
)
)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;
答案 0 :(得分:0)
可以通过两种方式完成。
删除FOREIGN约束,
加载数据和
重新创建约束。
或
使用
禁用约束SET foreign_key_checks = 0;
插入您的数据
SET foreign_key_checks = 1;