【问题标题】:what's the difference of sqoop import to hdfs and to hive?sqoop导入hdfs和hive有什么区别?
【发布时间】:2016-10-02 03:07:49
【问题描述】:

我能够使用 sqoop 将 mysql 表“标题”导入 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 中,如果我显示表,我会得到以下信息:

hive> show tables;
OK
dept_emp
emp
myfirsthivetable
parted1emp
partitionedemp

你可以看到 hive 中没有名为titles的表

我对此感到困惑,对于sqoop导入的数据,hdfs和hive之间是否存在1对1的关系?提示是什么意思?

感谢您的启发。

【问题讨论】:

    标签: mysql hive hdfs sqoop


    【解决方案1】:

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

    在您的第二个命令中,您告诉 Sqoop 将(再次)整个表(已在第一个命令中导入)导入 Hive。由于您没有将--target-dir 指定为HDFS 目标,Sqoop 将尝试在/user/root/ 下创建文件夹titles。 SI由于该文件夹已存在,因此引发了错误。

    当您告诉 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 知道表(和数据)在哪里。

    但是,如果您不想删除包含已导入数据的文件夹怎么办?在这种情况下,您可以 create 一个新的 Hive 表 titles 并使用以下方式指定数据的位置:

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

    这样,您无需再次重新导入整个数据,因为它已经在 HDFS 中了。

    【讨论】:

    • 感谢 Jaime 的详细解释。非常感谢大家的帮助。
    • 刚刚又试了一遍,提示target-dir=titles_new,数据已经加载到hive中,当我列出hive时,可以看到新增的表;但是,如果我以不同的方式列出它:[root@xie1 Desktop]# hdfs dfs -ls hdfs://localhost:9000/user/root,它就不存在了。我也试过:hdfs dfs -ls hdfs://localhost:9000/user/titles_new 提示没有这样的文件或目录。
    • 对不起,我想我打错了。 --target-dir 参数应该包含目录的完整路径。在这种情况下,--target-dir=/user/root/titles。你能检查一下导入的表是否在/titles中吗?
    • 谢谢。在上面的评论中,我已经说过没有这样的文件或目录。 :)
    • 是的,但在评论中您正在检查/user/titles_new/titles_new下面有什么吗?
    【解决方案2】:

    当您在 hive 上创建表时,它最终会在 HDFS 上创建一个目录,因为您已经先运行了 hadoop 导入,因此已经在 HDFS 上创建了一个名为“titles”的目录。

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

    可以参考sqoopdocumentation

    希望这会有所帮助。

    【讨论】:

    • 谢谢。 hdfs dfs -ls hdfs://localhost:9000/user/roothdfs dfs -ls 给出完全相同的结果?
    • 转到您的 hadoop 安装目录并运行 bin/hadoop fs -ls /user/root 或 bin/hadoop fs -lsr /user/root
    猜你喜欢
    • 2019-07-12
    • 2013-10-31
    • 2017-07-12
    • 2016-08-07
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多