3306/workflow --tableproject--usernameshirdrn-P--hive-import ----default-character-set=utf-8
3306/workflow--usernameshirdrn-P--query'SELECTusers.*,tags.tagFROMusersJOINtagsON(users.id=tags.user_id)WHERE$CONDITIONS'--split-byusers.id--target-dir/hive/tag_db/user_tags ----default-character-set=utf-8
3306/workflow--tableproject--usernameshirdrn-P--hive-import--incrementalappend--check-columnid--last-value1----default-character-set=utf-8
3306/workflow --usernameshirdrn--P--tabletags--columns'id,tag'--create-hive-table-target-dir/hive/tag_db/tags-m1--hive-tabletags--hive-import----default-character-set=utf-8
1.
4.
5.
//--tableEMPLOYEES--validate--validatororg.apache.sqoop.validation.RowCountValidator--validation-thresholdorg.apache.sqoop.validation.AbsoluteValidationThreshold--validation-failurehandlerorg.apache.sqoop.validation.AbortOnFailureHandler
导出过程中HDFS源路径
-m,--num-mappers
使用n个map任务并行导出
--table
导出的目的表名称
--call
导出数据调用的指定存储过程名
--update-key
更新参考的列名称,多个列名使用逗号分隔
--update-mode
指定更新策略,包括:
updateonly(默认)、allowinsert
--input-null-string
使用指定字符串,替换字符串类型值为null的列
--input-null-non-string
使用指定字符串,替换非字符串类型值为null的列
--staging-table
在数据导出到数据库之前,数据临时存放的表名称
--clear-staging-table
清除工作区中临时存放的数据
--batch
使用批量模式导出
下面,我们通过实例来说明,在实际中如何使用这些选项。
这里,我们主要结合一个实例,讲解如何将Hive中的数据导入到MySQL数据库。
首先,我们准备几个表,MySQL数据库为tag_db,里面有两个表,定义如下所示:
1.CREATETABLEtag_db.users(
2. idINT(11)NOTNULLAUTO_INCREMENT,
3. nameVARCHAR(100)NOTNULL,
4. PRIMARYKEY(`id`)
5.)ENGINE=InnoDBDEFAULTCHARSET=utf8;
6.
7.
8.CREATETABLEtag_db.tags(
9. idINT(11)NOTNULLAUTO_INCREMENT,
10. user_idINTNOTNULL,
11. tagVARCHAR(100)NOTNULL,
12. PRIMARYKEY(`id`)
13.)ENGINE=InnoDBDEFAULTCHARSET=utf8;
14.
15.
复制代码
这两个表中存储的是基础数据,同时对应着Hive中如下两个表:
1.CREATETABLEusers(
2. idINT,
3. nameSTRING
4.);
5.
6.CREATETABLEtags(
7. idINT,
8. user_idINT,
9. tagSTRING
10.);
11.
复制代码
我们首先在上述MySQL的两个表中插入一些测试数据:
1.INSERTINTOtag_db.users(name)VALUES('jeffery');
2.INSERTINTOtag_db.users(name)VALUES('shirdrn');
3.INSERTINTOtag_db.users(name)VALUES('sulee');
4.
5.INSERTINTOtag_db.tags(user_id,tag)VALUES(1,'Music');
6.INSERTINTOtag_db.tags(user_id,tag)VALUES(1,'Programming');
7.INSERTINTOtag_db.tags(user_id,tag)VALUES(2,'Travel');
8.INSERTINTOtag_db.tags(user_id,tag)VALUES(3,'Sport');
9.
复制代码
然后,使用Sqoop的import工具,将MySQL两个表中的数据导入到Hive表,执行如下命令行:
1.bin/sqoopimport--connectjdbc:
mysql:
//10.95.3.49:
3306/tag_db--tableusers--usernameshirdrn-P--hive-import----default-character-set=utf-8
2.
3.bin/sqoopimport--connect jdbc:
mysql:
//10.95.3.49:
3306/tag_db--tabletags--usernameshirdrn-P--hive-import----default-character-set=utf-8
复制代码
导入成功以后,再在Hive中创建一个用来存储users和tags关联后数据的表:
1.CREATETABLEuser_tags(
2. idSTRING,
3. nameSTRING,
4. tagSTRING
5.);
6.
复制代码
执行如下HQL语句,将关联数据插入user_tags表:
1.FROMusersuJOINtagstONu.id=t.user_idINSERTINTOTABLEuser_tagsSELECTCONCAT(CAST(u.idASSTRING),CAST(t.idASSTRING)),u.name,t.tag;
复制代码
将users.id与tags.id拼接的字符串,作为新表的唯一字段id,name是用户名,tag是标签名称。
再在MySQL中创建一个对应的user_tags表,如下所示:
1.CREATETABLEtag_db.user_tags(
2. idvarchar(200)NOTNULL,
3. namevarchar(100)NOTNULL,
4. tagvarchar(100)NOTNULL
5.);
6.
复制代码
使用Sqoop的export工具,将Hive表user_tags的数据同步到MySQL表tag_db.user_tags中,执行如下命令行:
1.bin/sqoopexport--connect jdbc:
mysql:
//10.95.3.49:
3306/tag_db--usernameshirdrn--P--tableuser_tags--export-dir/hive/user_tags--input-fields-terminated-by'\001'----default-character-set=utf-8
复制代码
执行导出成功后,可以在MySQL的tag_db.user_tags表中看到对应的数据。
如果在导出的时候出现类似如下的错误:
1.14/02/2717:
59:
06INFOmapred.JobClient:
TaskId:
attempt_201402260008_0057_m_000001_0,Status:
FAILED
2.java.io.IOException:
Can'texportdata,pleasechecktasktrackerlogs
3. atorg.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:
112)
4. atorg.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:
39)
5. atorg.apache.hadoop.mapreduce.Mapper.run(Mapper.java:
145)
6. atorg.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:
64)
7. atorg.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:
764)
8. atorg.apache.hadoop.mapred.MapTask.run(MapTask.java:
364)
9. atorg.apache.hadoop.mapred.Child$4.run(Child.java:
255)
10. atjava.security.AccessController.doPrivileged(NativeMethod)
11. atjavax.security.auth.Subject.doAs(Subject.java:
396)
12. atorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:
1190)
13. atorg.apache.hadoop.mapred.Child.main(Child.java:
249)
14.Causedby:
java.util.NoSuchElementException
15. atjava.util.AbstractList$Itr.next(AbstractList.java:
350)
16. atuser_tags.__loadFromFields(user_tags.java:
225)
17. atuser_tags.parse(user_tags.java:
174)
18. atorg.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:
83)
19. ...10more
20.
复制代码
通过指定字段分隔符选项--input-fields-terminated-by,指定Hive中表字段之间使用的分隔符,供Sqoop读取解析,就不会报错了。
附网上的导入命令参考:
SqoopImportExamples:
SqoopImport:
-Importdatafromarelationaldatabasemanagementsystem(RDBMS)suchasMySQLorOracleintotheHadoopDistributedFileSystem(HDFS)anditssubprojects(Hive,HBase).
Importthedata(MySQLtable)toHBase:
Case1:
IftablehaveprimarykeyandimportallthecolumnofMySQLtableintoHBasetable.
$bin/sqoopimport--connectjdbc:
mysql:
//localhost/db1--usernameroot--passwordroot--tabletableName--hbase-tablehbase_tableName --column-familyhbase_table_col1--hbase-create-table
Case2:
IftablehaveprimarykeyandimportonlyfewcolumnsofMySQLtableintoHBasetable.
$bin/sqoopimport--connectjdbc:
mysql:
//localhost/db1--usernameroot--passwordroot--tabletableName--hbase-tablehbase_tableName--columnscolumn1,column2--column-familyhbase_table_col1--hbase-create-table
Note:
Columnnamesspecifiedin--columnsattributemustcontaintheprimarykeycolumn.
Case3:
Iftabledoesn'thaveprimarykeythenchooseonecolumnasahbase-row-key.ImportallthecolumnofMySQLtableintoHBasetable.
$bin/sqoopimport--connectjdbc:
mysql:
//localhost/db1--usernameroot--passwordroot--tabletableName--hbase-tablehbase_tableName--column-familyhbase_table_col1--hbase-r