我使用sqoop命令将mysql表“title”导入到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我会被告知:
输出目录hdfs://localhost:9000/user/root/title已经存在
在蜂巢中,如果我做了一个展示表,就会得到以下内容:
hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp你可以看到,在蜂巢中没有一个名为标题的表。
我对此感到困惑,对于sqoop导入的数据,hdfs和hive之间是否有1到1的关系?提示的意思是什么?
谢谢你的启发。
发布于 2016-10-02 10:21:00
正如Amit所指出的,由于您已经在第一个命令中创建了HDFS目录,Sqoop拒绝覆盖文件夹titles,因为它已经包含数据。
在第二个命令中,您告诉Sqoop将整个表(在第一个命令中已经导入)导入Hive。由于您没有用HDFS目的地指定--target-dir,所以Sqoop将尝试在/user/root/下创建文件夹titles。SInce此文件夹已存在,引发错误。
当您告诉Hive显示表时,titles不会出现,因为第二个命令(使用hive-import)没有成功,而且Hive对数据一无所知。当您添加标志--hive-import时,Sqoop在外壳下所做的是更新Hive亚稳态,它是一个具有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目录并更新转移目录,以便Hive知道表(和数据)在哪里。
但是,如果您不想用您已经导入的数据删除文件夹呢?在这种情况下,您可以使用以下内容来创建一个新的Hive表titles并指定数据的位置:
CREATE [TEMPORARY] [EXTERNAL] TABLE title
[(col_name data_type [COMMENT col_comment], ...)]
(...)
LOCATION '/user/root/titles'这样,您就不需要重新导入整个数据,因为它已经在HDFS中了。
发布于 2016-10-02 03:23:07
当您在hive上创建一个表时,它最终会在HDFS上创建一个目录,因为您已经运行了hadoop导入,因此已经在HDFS上创建了一个名为“title”的目录。
您可以从HDFS中删除/user/root/titles目录并再次运行hive命令,或者在导入时使用--hive-table选项。
您可以参考sqoop 文档。
希望这能有所帮助。
https://stackoverflow.com/questions/39813480
复制相似问题