开发者学堂课程【Sqoop 企业级大数据迁移方案实战:导出 Export--默认模式导出(Insert)--配置参数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/718/detail/12842
导出 Export--默认模式导出(Insert)--配置参数
内容介绍:
一、--input-fields-terminated-by'\t'(指定文件中的分隔符)
二、--columns
三、--export-dir 导出目录
四、--input-null-string--input-null-non-string
在进行数据导出时,有如下参数需要特别注意:
一、--input-fields-terminated-by'\t'(指定文件中的分隔符)
一般情况下默认数据以逗号来分割,解析时也默认以逗号分割。如果此时数据中恰好也是逗号,此时可以不指定,按照默认的字号来切割。但如果数据不是逗号,是制表符或者是竖线或者是其他符号,甚至是以-001来分割的,此时如果不加上该字段就不能进行切割。切割不出字段,表中进行映射的插入图时就会报错,所以字段分割符一定要指定。
二、--columns
指定列的顺序,在刚才导出的文件中并没有指定--columns。是因为创建的文件中的 ID、name、deg、salary、dept顺序包括类型个数跟表名保持一致。
如果导入数和表的顺序不一样,或者存在问题,此时必须用--columns 来指定字段的排序。若数据文件和目标字段完全一致可以不写。
演示:
重新创建表,但是在创建中人为修改顺序:
在数据库中创建新表:
create table employee1 (
id int not null primary key,
salary int,
deg varchar(20),
name varchar(20),
dept varchar(10));
此时表与默认文件顺序不同。
运行代码,刷新 userdb 中的 employee1.但是 employee1中的字段与文件中的字段不同。此时若不做修改,在 sqoop 中执行语句:
bin/sqoop export \
--connect jdbc:mysgl:://node-1:3306/userdb \
--username root \
--password hadoop \
--table employee1 \
--export-dir /emp_data/
结果出现 NumberFormatException,需要数据类型,但报的为字符串类型所以出现报错。因为数据中的类型与目标文件中正好相反,此时就需要添加上--columns 参数,该参数就可以指定参数类型。例如在导入时--export-dir /emp_data/上添加--columns:
--columns id,name,deg,salary,dept \
继续在 sqoop 中执行语句
结果显示:
解析导入100%,说明正确将数据识别到。运行结束后提示6条记录。
再在数据表中进行验证,刷新 employee1,结果显示:
选择列并控制它们的排序。当导出数据文件和目标表字段列顺序完全一致的时候可以不写。否则以逗号为间隔选择和排列各个列。没有被包含在-columns 面列名或字段要么具备默认值,要么就允许插入空值。否则数据库会拒绝接受sqoop 导出的数据,导致 sqoop 作业失败。
三、--export-dir 导出目录
在执行导出的时候,必须指定这个参数,同时需要具备--table或--call 参数两者之一,--table 是指的导出数据库当中对应的表,--call 是指的某个存储过程。
四、--input-null-string--input-null-non-string
在数据库中如果某个字段为空:
为空需要查看该字段的类型。针对这样空的字段以 NULL 来表示,导入导出时涉及到在文件上怎么表示。如果不指定会发现针对这一空值会变成一个空字符串来表示空值,不利于后期处理。在数据库中为空为 NULL,在文件中为空以\n 来表示。所以这两个参数往往在业务当中用的较多,无论是字符串类型还是非字符串类型,针对空的数据,统一以\n 这种符号来表示,\n 转移到数据库就是一个空的数据不会显示一个字符串,对于空的字符串以\n 来替代。不是这种字符串的空值也以\n 来替代。这样避免了使用 NULL 字符串来表示空值的情况。
如果没有指定第一个参数,对于字符串类型的列来说,“NULL”这个字符串就回被翻译成空值,如果没有使用第二个参数,无论是“NULL”字符串还是说空字符串也好,对于非字符串类型的字段来说,这两个类型的空串都会被翻译成空值。比如:
--input-null-string"\\N"--input-null-non-string"\\N"
\\N前的第一个\表示转义。
以上几个配置参数在进行数据导入导出时使用比较多,需要结合实际场景灵活使用。
小结:
相关配置参数
导出文件的分隔符 如果不指定默认以”,”去切割读取数据文件
可通过--input-fields-terminated-by 来指定
如果文件的字段顺序和表中顺序不一致需要--columns 指定多个字段之间以","分割
导出的时候需要指定导出数据的目录 export-dir 和导出到目标的表名或者存储过程名
针对空字符串类型和非字符串类型的转换“\n"