我能够使用sqoop导入一个mysql表" 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
我会被提示:
输出目录hdfs:// localhost:9000 / user / root / titles已存在
在蜂巢中,如果我做一个表格表,我会得到以下结果:
hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp
您可以看到hive中没有名为titles的表
我对此感到困惑,对于sqoop导入的数据,hdfs和hive之间是否有任何1对1的关系?提示的含义是什么?
感谢您的恭喜。
答案 0 :(得分:2)
正如Amit所指出的那样,由于您已经在第一个命令中创建了HDFS目录,因此Sqoop拒绝覆盖文件夹titles
,因为它已包含数据。
在第二个命令中,您告诉Sqoop将整个表(已经在第一个命令中导入)导入(再次)到Hive中。由于您未指定具有HDFS目标的--target-dir
,因此Sqoop将尝试在titles
下创建文件夹/user/root/
。如果此文件夹已存在,则会引发错误。
当你告诉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,以便Hive知道表(和数据)的位置。
但是,如果您不想删除已导入数据的文件夹,该怎么办?在这种情况下,您可以create使用新的Hive表titles
并使用以下内容指定数据的位置:
CREATE [TEMPORARY] [EXTERNAL] TABLE title
[(col_name data_type [COMMENT col_comment], ...)]
(...)
LOCATION '/user/root/titles'
这样,您就不需要再次重新导入整个数据,因为它已经在HDFS中了。
答案 1 :(得分:0)
当你在hive上创建一个表时,它最终会在HDFS上创建一个目录,因为你已经先运行了hadoop import,因此已经在HDFS上创建了一个名为“titles”的目录。
您是否可以从HDFS中删除/user/root/titles
目录并再次运行hive import命令或在导入时使用--hive-table
选项。
您可以参考sqoop documentation。
希望这有帮助。