sqoop 导入到 hdfs 和 hive 有什么区别?

what's the difference of sqoop import to hdfs and to hive?

我能够使用 sqoop 使用如下命令将 mysql table "titles" 导入到 hdfs:

sqoop import --connect jdbc:mysql://localhost/employees --username=root -P --table=titles --target-dir=titles --m=1

现在我想导入到hive,如果我使用下面的命令:

sqoop import --connect jdbc:mysql://localhost/employees --username=root -P --table titles --hive-import

系统会提示我:

Output directory hdfs://localhost:9000/user/root/titles already exists

在蜂巢中,如果我做一个节目 tables 我会得到以下信息:

hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp

可以看到hive中没有table调用的titles

我很纳闷,对于sqoop导入的数据,hdfs和hive有没有一对一的关系?提示是什么意思?

感谢您的启发。

当您在 hive 上创建一个 table 时,它最终会在 HDFS 上创建一个目录,因为您已经 运行 首先导入 hadoop,因此已经在 HDFS 上创建了一个名为 "titles" 的目录.

您可以从 HDFS 中删除 /user/root/titles 目录并再次 运行 配置单元导入命令,或者在导入时使用 --hive-table 选项。

可以参考sqoop documentation.

希望对您有所帮助。

正如 Amit 所指出的,由于您已经在第一个命令中创建了 HDFS 目录,Sqoop 拒绝覆盖文件夹 titles,因为它已经包含数据。

在您的第二个命令中,您告诉 Sqoop 将整个 table(已在第一个命令中导入)导入(再次)到 Hive 中。由于您没有为 HDFS 目标指定 --target-dir,Sqoop 将尝试在 /user/root/ 下创建文件夹 titles。由于此文件夹已存在,因此出现错误。

当您告诉 Hive 显示 tables 时,titles 不会出现,因为第二个命令(带有 hive-import)不成功,并且 Hive 不知道关于数据的任何事情。当您添加标志 --hive-import 时,Sqoop 在幕后所做的是更新 Hive 元存储,这是一个包含 Hive table、分区和 HDFS 位置的元数据的数据库。

您可以只使用一个 Sqoop 命令而不是使用两个不同的命令来导入数据。如果删除 titles HDFS 文件夹并执行如下操作:

sqoop import --connect jdbc:mysql://localhost/employees --username=root 
-P --table=titles --target-dir /user/root/titles --hive-import --m=1

这样,您从 Mysql 中提取数据,创建 /user/root/titles HDFS 目录并更新 Metastore,以便 Hive 知道 table(和数据)在哪里是。

但是,如果您不想删除包含已导入数据的文件夹怎么办?在这种情况下,您可以 create 一个新的 Hive table titles 并使用如下方式指定数据的位置:

CREATE [TEMPORARY] [EXTERNAL] TABLE title    
  [(col_name data_type [COMMENT col_comment], ...)]
  (...)
  LOCATION '/user/root/titles'

这样,您就不需要再次重新导入整个数据,因为它已经在 HDFS 中了。