sqoop数据库表导入步骤01

一:数据库的表数据导入hive

查看sqoop的执行进度: http://tdh-node01:8088/cluster/apps

1.查看配置文件位置:(tab键为快捷提示键)

source tdh-client/TDH-Client/init.sh 打开命令(不打开无法后续操作)
cd ynyc-bg/transaction/options-file/ 查看配置文件位置

2.

ll
会出来一系列的配置信息(小写LL)在这里插入图片描述

3.返回:

cd ~
执行cd ~会返回到在这里插入图片描述

4.开始导入

sqoop job \
 --create tb_logistics_purchase_import_job \                                    命名规则:尽量表名_import_job
 -- import \
 --options-file /root/ynyc-bg/transaction/options-file/commdity-177.opt \       配置文件路径
 --table tb_logistics_purchase \      
 --target-dir /sqoop/hv_transaction/tb_logistics_purchase \                     导入数据表存放路径跟外表相对应
 --null-string '\\N' \
 --null-non-string '\\N' \
 --fields-terminated-by "|" \
 --incremental lastmodified \
 --check-column create_time \
 --merge-key id \
 --last-value "1999-01-21 00:00:00" \                                           
 -m1

例子二:(与上边相比下边的–更靠近左边,所以下边的错误率更低)
重点:这三步不能少,一代那个要查看root后的文件
在这里插入图片描述
在这里插入图片描述

cd ynyc-bg/transaction/options-file/
ll
cd~

sqoop job \
--create tb_ccb_order_bill_import_job \
-- import \
--options-file /root/ynyc-bg/transaction/options-file/transaction-177.opt \
--table tb_ccb_order_bill \
--target-dir /sqoop/hv_transaction/tb_ccb_order_bill \
--null-string '\\N' \
--null-non-string '\\N' \
--fields-terminated-by "|" \
--incremental lastmodified \
--check-column update_time \
--merge-key id \
--last-value "1999-01-21 00:00:00" \
-m1

执行上边的语句直接会返回如下图,表示执行成功了
在这里插入图片描述

5.执行job

sqoop job --exec tb_logistics_purchase_import_job
sqoop job --exec job名称

出现如下图的内容表示成功在这里插入图片描述

6.获取数据库构表过程进行修改

varchar(108)改为 STRING ————
datetime改为TIMESTAMP————double(11,2)改为double 表头table前边添加external
删除set到not null之前的内容 表后括号外删除掉添加: row format delimited fields terminated
by ‘|’ stored as textfile location ‘导入数据表存放路径’;

修改后的代码如下:

 CREATE external TABLE `hvtext_sub_logistics_purchase` (
  `id` STRING  NOT NULL COMMENT '主键',
  `account_id` STRING  NOT NULL COMMENT '账户id',
  `par_id` STRING   DEFAULT NULL COMMENT '主表id',
  `com_code` STRING   NOT NULL COMMENT '商品编码',
  `com_name` STRING DEFAULT NULL COMMENT '商品名称',
  `purchase_num` decimal(11,2) NOT NULL COMMENT '进货数量',
  `purchase_cost` decimal(11,2) NOT NULL COMMENT '进货单价成本',
  `purchase_cost_total` decimal(11,2) NOT NULL COMMENT '进货成本',
  `supplier_id` STRING  DEFAULT NULL COMMENT '供货商id',
  `purchase_price` decimal(11,2) DEFAULT NULL COMMENT '进货售价',
  `purchase_price_total` decimal(11,2) DEFAULT NULL COMMENT '进货总售价',
  PRIMARY KEY (`id`)
) row format delimited
fields terminated by '|'
stored as textfile
location '/sqoop/hv_transaction/tb_sub_logistics_purchase';

原数据库代码如下:

CREATE TABLE `tb_sub_logistics_purchase` (
  `id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
  `account_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '账户id',
  `par_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '主表id',
  `com_code` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '商品编码',
  `com_name` varchar(128) DEFAULT NULL COMMENT '商品名称',
  `purchase_num` decimal(11,2) NOT NULL COMMENT '进货数量',
  `purchase_cost` decimal(11,2) NOT NULL COMMENT '进货单价成本',
  `purchase_cost_total` decimal(11,2) NOT NULL COMMENT '进货成本',
  `supplier_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '供货商id',
  `purchase_price` decimal(11,2) DEFAULT NULL COMMENT '进货售价',
  `purchase_price_total` decimal(11,2) DEFAULT NULL COMMENT '进货总售价',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

7.在dbvisualizer里执行修改后的sql语句
在这里插入图片描述

二:进行导入的表没有时间戳格式的列需要用全量导入

1.查看配置文件位置:

cd ynyc-bg/transaction/options-file/

ll
会出来一系列的配置信息(小写LL)在这里插入图片描述

3.返回:

cd ~

4.开始导入

//全量导入3:tb_sub_logistics_return_import_job
sqoop \
import \
--options-file /root/ynyc-bg/transaction/options-file/transaction-177.opt \
--table tb_order_bill \
--target-dir /sqoop/hv_transaction/tb_order_bills \
--null-string '\\N' \
--null-non-string '\\N' \
--fields-terminated-by "|" \
-m 3

5.不需要执行job:

sqoop job --exec tb_logistics_purchase_import_job

6.获取数据库构表过程进行修改

varchar(108)改为 STRING datetime改为TIMESTAMP
double(11,2)改为double 表头table前边添加external 删除set到not null之前的内容
表后括号外删除掉添加: row format delimited fields terminated by ‘|’ stored as
textfile location ‘导入数据表存放路径’;

7.在dbvisualizer里执行修改后的sql语句
在这里插入图片描述

官方文档地址:
http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_purpose

三.导出:

3.1 导出的前提条件:在hive中创建表的时候(注意要跟数据库的字段要保持一致,否则会导出错误):
注意1:要导入的MySQL的表如果没有唯一型主键,就要建立两个索引用以区分导入数据(这两个索引在一起具有唯一性),否则数据库的表会筛选数据,致使数据缺失.
注意2:要在创表的table前边加上external 表名创建的是一个外表,在结束要加上:

row format delimited
fields terminated by ','
stored as textfile
location '/sqoop/member/tb_sponsor_account';

整体如下:

show create table hvtext_sponsor_account;
create external  table hvtext_sponsor_account(
  id string default null, 
  account_balance decimal(11,2) default null, 
  account_status int default null, 
  create_time timestamp default null, 
  update_time timestamp default null, 
  remark string default null
)

row format delimited
fields terminated by ','
stored as textfile
location '/sqoop/member/tb_sponsor_account';

3.2

sqoop export \
--options-file /root/ynyc-bg/transaction/options-file/realtime-177.opt \
--table tb_commodity_sale_per_day \
--input-fields-terminated-by '|' \
--export-dir '/inceptor1/user/hive/warehouse/hv_transaction.db/root/hvtext_commodity_sale_pers_days' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--update-mode allowinsert \
--update-key account_id,short_code,create_date \
-m1

–input-null-string ‘\N’
–input-null-non-string ‘\N’
这两个很重要,如果没有传过来的null值会成 /n

思考:

vim tb_data_export_main.sh     sqoop中的作用

在这里插入图片描述
如上图所示要查看所要导入的数据库是否能够接收导入的数据

3.3 Sqoop抽数脚本(在网上找的,仅作参考):

sqoop export \
--connect jdbc:mysql://ip-172-31-22-86.ap-southeast-1.compute.internal:3306/test_db \
--username testuser \
--password password \
--table mytest_parquet \
--hcatalog-database default \
--hcatalog-table mytest_parquet --num-mappers 1

参数说明:

–table:MySQL库中的表名

–hcatalog-database:Hive中的库名

–hcatalog-table:Hive库中的表名,需要抽数的表

–num-mappers:执行作业的Map数

作业执行成功。

四. Hive建表的注意事项:

CREATE external TABLE `rhvtext_search_shop_bill_result` (
  `account_id` STRING NOT NULL COMMENT '商户id',
  `trans_total` decimal(11,2) DEFAULT NULL COMMENT '交易总价',
  `amount_received` decimal(11,2) DEFAULT NULL COMMENT '实收金额,实际到账',
  `amount_liquidation` decimal(11,2) DEFAULT NULL COMMENT '实际清算金额',
  `fee` decimal(11,2) DEFAULT NULL COMMENT '我方平台手续费',
  `mer_fee` decimal(11,2) DEFAULT NULL COMMENT '第三方平台手续费',
  `fee_total` decimal(11,2) DEFAULT NULL COMMENT '总手续费',
  `trade_time` date DEFAULT NULL COMMENT '交易时间,也是服务器时间',
  `org_short_name` STRING DEFAULT NULL COMMENT '机构短名称',
  `province_id` STRING DEFAULT NULL COMMENT '省机构id',
  `city_id` STRING DEFAULT NULL COMMENT '市机构id',
  `area_id` STRING DEFAULT NULL COMMENT '区机构id',
  `owner_name` STRING DEFAULT NULL COMMENT '店主名字',
  `phone_no` STRING DEFAULT NULL COMMENT '电话号码',
  `manager_name` STRING DEFAULT NULL COMMENT '所属客户经理姓名',
  `manager_id`STRING DEFAULT NULL COMMENT '所属客户经理id',
  `mamager_code` STRING DEFAULT NULL COMMENT '所属客户经理code',
  `create_time` TIMESTAMP DEFAULT NULL COMMENT '创建时间',
  `update_time` TIMESTAMP DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`account_id`)
)row format delimited
fields terminated by '|'
stored as textfile;

在这里插入图片描述

五 导入导出的注意事项

1.再导入到hdfs的时候,导入语句尽量不要有:
–null-string ‘\N’
–null-non-string ‘\N’
因为有这个的话,在创建job的时候是完全没有问题的,能够导入所要导入的数据,但是如果数据库的数据更新后,你要将数据更新的hdfs上就会出现问题:Can’t parse input data: ‘\N’
这个问题困扰我很久,出现这个问题要考虑,这个问题的出现原因,创建的时候就可以为什么现在不行了呢,数据是copy的数据进行改动,那么也应该就是导入语句的问题了,哪个问题呢?大胆猜测是否是/N惹的祸,那么去掉两个空字符处理或者去掉一个测试一下,果然可行.
但是又有新的问题了,导出有这两个转义字符’\N’就没有问题?
答案:导入的时候如果用了两个//N那么就会将空的字符串转成/N给存进去,但是空的string类型的转成/N没太大问题,但是一张数据库表里有很多的列有的列并不是string,可能有decimal,double,date,datetime…这些如果被转成string的/N了,存储的时候软件就会发现date这些格式怎么是/N格式不对照就出错了.
当然又有问题了创建job的时候存储数据为什么没有出错呢?
可能是程序的问题,创建job的时候是正常的将空值给转义了,在更新的时候转义失败了(个人感觉并不一定对,有更好的答案请留言)
习惯
测试的时候会创建很多的job,job又会创建很多的hdfs上的存储文件,测试完成要将这些job和文件给删除掉.(不删除的后果,就是你测的时候要建很多的job和hdfs存储文件,数仓里就要建立新表,占用内存)
查看存储文件语句:Hadoop fs -ls <存储文件路径>
查看存储文件内容:hadoop fs -cat <存储文件路径>/<存储信息>
删除存储文件语句:Hadoop fs -rm -r <存储文件路径>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值