我可以使用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的关系?提示的意思是什么?
谢谢你的启发。
2条答案
按热度按时间zysjyyx41#
当您在hive上创建一个表时,它最终会在hdfs上创建一个目录,因为您已经首先运行了hadoop导入,因此已经在hdfs上创建了一个名为“titles”的目录。
你可以删除
/user/root/titles
目录,并再次运行配置单元导入命令或使用--hive-table
导入时的选项。您可以参考sqoop文档。
希望这有帮助。
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文件夹,然后执行以下操作:这样,您就可以从mysql中提取数据,创建
/user/root/titles
hdfs目录并更新metastore,以便hive知道表(和数据)的位置。但如果您不想删除包含已导入数据的文件夹,该怎么办?在这种情况下,您可以创建一个新的配置单元表
titles
并使用如下方式指定数据的位置:这样,就不需要再次重新导入整个数据,因为它已经在hdfs中了。