请告诉我下面两个命令之间有什么区别
sqoop import --connect jdbc:mysql://localhost:3306/db1
--username root --password password
--table tableName --hive-table tableName --create-hive-table --hive-import;
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/db1
--username root --password password;
使用--create-hive-table
&有什么区别?两个命令中只有create-hive-table
?
答案 0 :(得分:1)
考虑两个问题:
1)当使用--create-hive-table
时,RDBMS表的内容将被复制到--target-dir
(HDFS位置)所提到的位置。这将检查表格sqoop.emp是否存在于Hive中。
如果Hive中的表不存在,则来自HDFS位置的数据将移动到配置单表,一切顺利。
如果表(sqoop.emp)已存在于Hive中,则会引发错误:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. AlreadyExistsException(message:Table emp already exists)
示例:
sqoop import \
--connect jdbc:mysql://jclient.ambari.org/sqoop \
--username hdfs -P \
--table employee \
--target-dir /user/hive/sqoop/employee \
--delete-target-dir \
--hive-import \
--hive-table sqoophive.emp \
--create-hive-table \
--fields-terminated-by ',' \
--num-mappers 3
2)在没有create-hive-table
的情况下使用hive-import
时
获取swoop.employee(在RDBMS中)的模式,并使用该表在hive(default.employee)中的默认数据库下创建。但没有数据传输。
示例(书中给出的修改形式(Tom White的Hadoop权威指南):
sqoop create-hive-table \
--connect jdbc:mysql://jclient.ambari.org/sqoop \
--username hdfs -P \
--table employee \
--fields-terminated-by ','
现在的问题是,何时使用什么。如果RDBMS中不存在任何数据,则使用前者,我们不仅需要一次创建,而且还要在Hive中填充表。 当必须在Hive中创建表但不填充表时使用后者。或者,如果数据已经存在于HDFS中,并且它将用于填充配置单元表。
答案 1 :(得分:0)
sqoop-import --connect jdbc:mysql://localhost:3306/db1
>-username root -password password
>--table tableName --hive-table tableName --create-hive-table --hive-import;
上面的命令将使用hive默认设置将数据从db导入到hive中,如果表尚未存在,它将在Hive中创建一个具有与DB中相同的模式的表。
sqoop create-hive-table --connect jdbc:mysql://localhost:3306/db1
>-username root -password password;
create-hive-table工具将在Hive Metastore中创建一个表,其中包含一个基于先前导入HDFS的数据库表的表定义,或者计划导入的表(它将从sqoop作业中选取)。 这有效地执行了" - hive-import" sqoop-import的步骤,而不运行先前的导入。
例如,考虑使用sqoop将db1中的table1导入hdfs。如果您接下来执行create-hive-table,它将在hive Metastore中创建一个表,其中包含来自table1的db1的表模式。因此,将来在需要时将数据加载到此表中将非常有用。