使用 sqoop 将表从 RDBMS 导入 HIVE 后约束是不是仍然存在?

Posted

技术标签:

【中文标题】使用 sqoop 将表从 RDBMS 导入 HIVE 后约束是不是仍然存在?【英文标题】:Will the constraints remain after Importing table from RDBMS to HIVE with sqoop?使用 sqoop 将表从 RDBMS 导入 HIVE 后约束是否仍然存在? 【发布时间】:2019-03-15 16:07:23 【问题描述】:

当我们使用sqoop import将RDBMS表传输到HIVE时,表的主键约束会保留吗?

即作为 主键 的表的列是否会在 HIVE 处保留为主键。这些信息会在 Hive 元存储中吗?

非常感谢。

【问题讨论】:

【参考方案1】:

正如您在下面的 Hive QL 官方文档链接中看到的那样,自 Hive 版本 2.1.0 以来已添加 PRIMARY 和 FOREIGN 约束。 Hive QL

因此,我假设当您使用 sqoop 将表导入 Hive 时,PRIMARY 和 FOREIGN Keys 约束将保留。

我测试了一个 mysql 数据库的 sqoop 导入,我可以看到 PRIMARY KEY CONSTRAINT 在导入过程中没有维护。

MySQL 表格式:

    mysql> show create table employees;
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                                                                                   |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| employees | CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum('M','F') NOT NULL,
  `hire_date` date NOT NULL,
  PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

已使用以下命令将数据从 MySQL 导入 Hive:

sqoop import --connect jdbc:mysql://localhost/employees --username root --password password --table employees --hive-import --create-hive-table --hive-table employees

当我在 hive 中描述表时,我看不到 PRIMARY KEY CONSTRAINT

hive> show create table employees;
OK
CREATE TABLE `employees`(
  `emp_no` int, 
  `birth_date` string, 
  `first_name` string, 
  `last_name` string, 
  `gender` string, 
  `hire_date` string)
COMMENT 'Imported by sqoop on 2019/03/18 00:24:11'
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='', 
  'line.delim'='\n', 
  'serialization.format'='') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://localhost:9000/user/hive/warehouse/employees'
TBLPROPERTIES (
  'transient_lastDdlTime'='1552865076')
Time taken: 1.304 seconds, Fetched: 22 row(s)

我插入了一个具有相同员工编号的新行,以检查 Hive 是否管理 PK 约束。如您所见,新行已添加:

hive> insert into employees values (10001, "1986-04-17", "Hichem", 
"BOUSSETTA", "M", "2014-09-91");
Moving data to directory hdfs://localhost:9000/user/hive/warehouse/employees/.hive-staging_hive_2019-03-18_00-32-16_851_8569619447966100947-1/-ext-10000
Loading data to table default.employees
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1   Cumulative CPU: 5.79 sec   HDFS Read: 5080 HDFS Write: 120 SUCCESS
Total MapReduce CPU Time Spent: 5 seconds 790 msec
OK
Time taken: 42.422 seconds
hive> select * from employees;
OK
10001   1986-04-17  Hichem  BOUSSETTA   M   2014-09-91
10001   1953-09-02  Georgi  Facello M   1986-06-26
10002   1964-06-02  Bezalel Simmel  F   1985-11-21

因此得出结论:Sqoop 在将 RDBMS 数据导入 Hive 时不保留 PK 约束

【讨论】:

我认为这些约束适用于通过 HIVE shell-command 创建表时。如您所见,它适用于 HIVE DDL 语句。请在验证后告诉我。 是的,没错。我明天检查一下。预计 Hive 将越来越符合标准 sql。所以,我认为用 rdbms 同步数据时它很有可能会起作用 @eMazarakis 我今天做了测试,发现 sqoop 没有导入主键约束。我会更新我的第一个答案

以上是关于使用 sqoop 将表从 RDBMS 导入 HIVE 后约束是不是仍然存在?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sqoop 将表从 AWS RDS 移动到 AWS EMR 的问题

如何使用 Java 将表从 MySQL 导入 Hive?

无法使用 Sqoop 将数据从 Vertica 导入 Cassandra

sqoop配置安装以及导入

14_sqoop数据导入

我可以使用 Sqoop 将数据从 SQL Server 导入 Azure Blob 存储吗