sqoop 导入到 hdfs 和 hive 有什么区别?
what's the difference of sqoop import to hdfs and to hive?
我能够使用 sqoop 使用如下命令将 mysql table "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
系统会提示我:
Output directory hdfs://localhost:9000/user/root/titles already exists
在蜂巢中,如果我做一个节目 tables 我会得到以下信息:
hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp
可以看到hive中没有table调用的titles
我很纳闷,对于sqoop导入的数据,hdfs和hive有没有一对一的关系?提示是什么意思?
感谢您的启发。
当您在 hive 上创建一个 table 时,它最终会在 HDFS 上创建一个目录,因为您已经 运行 首先导入 hadoop,因此已经在 HDFS 上创建了一个名为 "titles" 的目录.
您可以从 HDFS 中删除 /user/root/titles
目录并再次 运行 配置单元导入命令,或者在导入时使用 --hive-table
选项。
可以参考sqoop documentation.
希望对您有所帮助。
正如 Amit 所指出的,由于您已经在第一个命令中创建了 HDFS 目录,Sqoop 拒绝覆盖文件夹 titles
,因为它已经包含数据。
在您的第二个命令中,您告诉 Sqoop 将整个 table(已在第一个命令中导入)导入(再次)到 Hive 中。由于您没有为 HDFS 目标指定 --target-dir
,Sqoop 将尝试在 /user/root/
下创建文件夹 titles
。由于此文件夹已存在,因此出现错误。
当您告诉 Hive 显示 tables 时,titles
不会出现,因为第二个命令(带有 hive-import
)不成功,并且 Hive 不知道关于数据的任何事情。当您添加标志 --hive-import
时,Sqoop 在幕后所做的是更新 Hive 元存储,这是一个包含 Hive table、分区和 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 知道 table(和数据)在哪里是。
但是,如果您不想删除包含已导入数据的文件夹怎么办?在这种情况下,您可以 create 一个新的 Hive table titles
并使用如下方式指定数据的位置:
CREATE [TEMPORARY] [EXTERNAL] TABLE title
[(col_name data_type [COMMENT col_comment], ...)]
(...)
LOCATION '/user/root/titles'
这样,您就不需要再次重新导入整个数据,因为它已经在 HDFS 中了。
我能够使用 sqoop 使用如下命令将 mysql table "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
系统会提示我:
Output directory hdfs://localhost:9000/user/root/titles already exists
在蜂巢中,如果我做一个节目 tables 我会得到以下信息:
hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp
可以看到hive中没有table调用的titles
我很纳闷,对于sqoop导入的数据,hdfs和hive有没有一对一的关系?提示是什么意思?
感谢您的启发。
当您在 hive 上创建一个 table 时,它最终会在 HDFS 上创建一个目录,因为您已经 运行 首先导入 hadoop,因此已经在 HDFS 上创建了一个名为 "titles" 的目录.
您可以从 HDFS 中删除 /user/root/titles
目录并再次 运行 配置单元导入命令,或者在导入时使用 --hive-table
选项。
可以参考sqoop documentation.
希望对您有所帮助。
正如 Amit 所指出的,由于您已经在第一个命令中创建了 HDFS 目录,Sqoop 拒绝覆盖文件夹 titles
,因为它已经包含数据。
在您的第二个命令中,您告诉 Sqoop 将整个 table(已在第一个命令中导入)导入(再次)到 Hive 中。由于您没有为 HDFS 目标指定 --target-dir
,Sqoop 将尝试在 /user/root/
下创建文件夹 titles
。由于此文件夹已存在,因此出现错误。
当您告诉 Hive 显示 tables 时,titles
不会出现,因为第二个命令(带有 hive-import
)不成功,并且 Hive 不知道关于数据的任何事情。当您添加标志 --hive-import
时,Sqoop 在幕后所做的是更新 Hive 元存储,这是一个包含 Hive table、分区和 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 知道 table(和数据)在哪里是。
但是,如果您不想删除包含已导入数据的文件夹怎么办?在这种情况下,您可以 create 一个新的 Hive table titles
并使用如下方式指定数据的位置:
CREATE [TEMPORARY] [EXTERNAL] TABLE title
[(col_name data_type [COMMENT col_comment], ...)]
(...)
LOCATION '/user/root/titles'
这样,您就不需要再次重新导入整个数据,因为它已经在 HDFS 中了。