【问题标题】: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 元存储中吗?

非常感谢。

【问题讨论】:

    标签: sql hive sqoop cloudera rdbms


    【解决方案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 没有导入主键约束。我会更新我的第一个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2016-03-17
    相关资源
    最近更新 更多