将查询结果从 mysql 导入现有 hive 表的问题

Posted

技术标签:

【中文标题】将查询结果从 mysql 导入现有 hive 表的问题【英文标题】:Issue in importing query result from mysql to existing hive table 【发布时间】:2019-03-29 09:52:17 【问题描述】:

当我尝试将 mysql 表导入现有配置单元表时,以下命令运行良好。 但是,当我尝试使用查询将结果导入同一个配置单元表时,它要求 --target-dir--split-by 。 导入查询结果时是否必须提供它们?为什么直接从表导入时不需要这些

我收到以下错误 -

警告:/usr/lib/sqoop/../accumulo 不存在! Accumulo 导入将失败。 请将 $ACCUMULO_HOME 设置为 Accumulo 安装的根目录。 19/03/29 02:50:40 INFO sqoop.Sqoop:运行 Sqoop 版本:1.4.6-cdh5.13.0 19/03/29 02:50:40 WARN tool.BaseSqoopTool:在命令行上设置密码是不安全的。考虑改用 -P。 必须使用 --target-dir 指定目标。 请尝试 --help 获取使用说明。

直接导入表格-

sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba \
--password cloudera \
--m 2 \
--table departments \
--hive-import \
--hive-home "/user/hive/warehouse/" \
--hive-table sqoop_import.dep \
--hive-overwrite \
--outdir java_files \

使用查询导入 -

sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba \
--password cloudera \
--m 2 \
--query "select department_id,department_name from departments where \$CONDITIONS and department_id>2" \
--hive-import \
--hive-home "/user/hive/warehouse/" \
--hive-table sqoop_import.dep \
--hive-overwrite \
--outdir java_files \

【问题讨论】:

【参考方案1】:

1.目标目录

默认情况下,Sqoop 将在 HDFS 上的主目录中创建一个与导入表同名的目录,并将所有数据导入那里。所以当你使用--query导入时,目录名是未知的,需要明确指定。

2.分割方式

在执行并行导入时,Sqoop 需要一个可以拆分工作负载的标准。 Sqoop 使用拆分列来拆分工作负载。默认情况下,Sqoop 将识别表中的主键列(如果存在)并将其用作拆分列,但通过使用查询导入,您必须选择带有--split-by 的拆分列(请参阅method)。

【讨论】:

是的,这是有道理的。非常感谢您的解释。

以上是关于将查询结果从 mysql 导入现有 hive 表的问题的主要内容,如果未能解决你的问题,请参考以下文章

hive常用功能:Hive数据导入导出方式

sqoop从mysql导入到hive为啥0变成null

使用 Hive 查询 Sqoop 到 MySQL

hive 数据导入

Hive 外部表架构重新连接

如何将mysql数据导入Hadoop之Sqoop安装