2016-10-02 61 views
0

我能够使用sqoop使用类似下面的命令导入MySQL表“标题”到HDFS:sqoop导入到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://本地主机:9000 /用户/根/标题已经存在

在蜂巢,如果我做一个节目表,我得到如下:

hive> show tables; 
OK 
dept_emp 
emp 
myfirsthivetable 
parted1emp 
partitionedemp 

你可以看到有在蜂巢

没有表名为标题,我在这迷茫,对进口的sqoop数据,hdfs和配置单元之间是否存在1:1的关系?提示的含义是什么?

谢谢你的启发。

回答

2

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

在你的第二个命令,你告诉Sqoop导入(再次)整个表(这是已经在第一个命令导入)到蜂巢。由于您没有将HDFS目标指定为--target-dir,因此Sqoop将尝试创建下的文件夹titles。如果该文件夹已经存在,则会引发错误。

当您告诉Hive显示表时,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,使蜂巢知道哪里表(和数据)是。

但是,如果您不想删除已导入数据的文件夹,该怎么办?在这种情况下,你可以create一个新的蜂巢表titles和使用这样的指定数据的位置:

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

这样一来,你就不需要再重新导入整个数据,因为它是已经在HDFS中。

+0

谢谢Jaime您的详细解释。大家的帮助在这里非常感谢。 – PasLeChoix

+0

只需再次尝试通过指示target-dir = titles_new并将数据加载到配置单元中,当列出配置单元时,我可以看到新添加的表;但是,如果我以不同的方式列出它:'[root @ xie1 Desktop]#hdfs dfs -ls hdfs:// localhost:9000/user/root',它不在那里。我也试过:'hdfs dfs -ls hdfs:// localhost:9000/user/titles_new',并提示没有这样的文件或目录。 – PasLeChoix

+0

对不起,我想我犯了一个错字。 '--target-dir'参数应该具有目录的整个路径。在这种情况下,'--target-dir =/user/root/titles'。你可以检查导入的表是否在'/ titles'中? –

0

当您创建的蜂巢它最终创建HDFS上的目录,因为你已经跑了Hadoop的进口第一,因此名为“标题”已对HDFS创建的目录表。

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

您可以参考sqoop documentation

希望这会有所帮助。

+0

谢谢。 'hdfs dfs -ls hdfs:// localhost:9000/user/root'和'hdfs dfs -ls'给出了完全相同的结果? – PasLeChoix

+0

转到您的hadoop安装目录并运行bin/hadoop fs -ls/user/root或bin/hadoop fs -lsr/user/root –

相关问题