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

qni6mghb  于 2021-06-03  发布在  Sqoop
关注(0)|答案(2)|浏览(866)

我可以使用sqoop将mysql表“titles”导入hdfs,命令如下:

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

现在,如果使用以下命令,我想导入到配置单元:

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

我将被提示:
输出目录hdfs://localhost:9000/user/root/titles已存在
在hive中,如果我显示表,我会得到以下结果:

hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp

您可以看到在hive中没有名为titles的表
我对此感到困惑,对于sqoop导入的数据,hdfs和hive之间是否存在1:1的关系?提示的意思是什么?
谢谢你的启发。

zysjyyx4

zysjyyx41#

当您在hive上创建一个表时,它最终会在hdfs上创建一个目录,因为您已经首先运行了hadoop导入,因此已经在hdfs上创建了一个名为“titles”的目录。
你可以删除 /user/root/titles 目录,并再次运行配置单元导入命令或使用 --hive-table 导入时的选项。
您可以参考sqoop文档。
希望这有帮助。

piok6c0g

piok6c0g2#

正如amit所指出的,由于您已经在第一个命令中创建了hdfs目录,sqoop拒绝覆盖该文件夹 titles 因为它已经包含了数据。
在第二个命令中,您告诉sqoop(再次)将整个表(在第一个命令中已经导入)导入到hive中。因为您没有指定 --target-dir 对于hdfs目标,sqoop将尝试创建文件夹 titles 低于 /user/root/ . 由于此文件夹已存在,因此引发了一个错误。
当你让Hive展示table的时候, titles 不会出现,因为第二个命令 hive-import )没有成功,而且hive对数据一无所知。添加标志时 --hive-import ,sqoop在后台所做的是更新hive metastore,它是一个包含hive表、分区和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知道表(和数据)的位置。
但如果您不想删除包含已导入数据的文件夹,该怎么办?在这种情况下,您可以创建一个新的配置单元表 titles 并使用如下方式指定数据的位置:

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

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

相关问题