sqoop1实战 定位数据同步错位数据
Last updated on November 20, 2024 am
🧙 Questions
跟踪并修复sqoop1数据同步失败问题
案例:
ads_t_user_record表中数据导出到mysql失败
字段信息 id,user_name,vin,sn,user_type,login_time,content,solution
☄️ Ideas
检查jobHistory,找到全日志
默认端口号
19888
http://192.168.21.71:19888/jobhistory
定位到错误代码
ads_t_user_record.java
的566
行报错
定位错误字段
# 找到对象文件
find / -name "ads_t_user_record.java"
vim /tmp/sqoop-ispong/compile/514da556fa1079f96ca28d153cf9d243/ads_t_user_record.java
# set number
# : 566
user_type 翻译错误将日期强转成数据类型
定位具体错误数据
-- hive
-- 查看数据显示是否有问题
select * from ads_t_user_record where login_time = '2022-03-29 23:52:27' limit 10
-- 将错误数据导出到一张临时表中
-- 建议使用textfile格式,方便使用dfs文件导出查看
create table if not exists ads_t_user_record_error(
id INT comment '主键ID',
user_name STRING comment '用户名',
vin STRING comment '登录所在车VIN',
sn STRING comment '登录所在车MP5的SN',
user_type INT comment '用户类型',
login_time TIMESTAMP comment '登录时间',
content STRING comment '内容',
solution STRING comment '解决方法'
) row format DELIMITED FIELDS TERMINATED BY '\002' LINES TERMINATED BY '\n' NULL DEFINED AS '\\N' STORED AS TEXTFILE
-- 导出错误数据
insert overwrite table ads_t_user_record_error
select
id,
user_name,
vin,
sn,
user_type,
login_time,
content,
solution
from ads_t_user_record t where t.id in ('162554448','162554062')
导出错误数据
# 找到hdfs上的文件
hadoop fs -ls /user/hive/warehouse/ispong_test.db/ads_t_user_record_error/
# 将hdfs的文件下载到服务器
hadoop fs -get /user/hive/warehouse/ispong_test.db/ads_t_user_record_error/part-00000-85cb4c54-27a8-4165-98b1-6fa23ce1f900-c000 ~/
找到原因
# 打开文件仔细观察
vim ~/part-00000-85cb4c54-27a8-4165-98b1-6fa23ce1f900-c000
sn
字段存在特殊字符 ^@
特殊字符对照表
特殊字符 | 编码 | 编码 | 编码 | 编码 | 编码 |
---|---|---|---|---|---|
^@ | NU | 0x00 | 0 | NULL (NUL)N | \u0000 |
^A | SH | 0x01 | 1 | START OF HEADING (SOH) | \u0001 |
^B | SX | 0x02 | 2 | START OF TEXT (STX) | \u0002 |
^C | EX | 0x03 | 3 | END OF TEXT (ETX) | \u0003 |
^D | ET | 0x04 | 4 | END OF TRANSMISSION (EOT) | \u0004 |
^E | EQ | 0x05 | 5 | ENQUIRY (ENQ) | \u0005 |
^F | AK | 0x06 | 6 | ACKNOWLEDGE (ACK) | \u0006 |
^G | BL | 0x07 | 7 | BELL (BEL) | \u0007 |
^H | BS | 0x08 | 8 | BACKSPACE (BS) | \u0008 |
^I | HT | 0x09 | 9 | CHARACTER TABULATION (HT) | \u0009 |
^@ | LF | 0x0a | 10 | LINE FEED (LF) | \u0010 |
^K | VT | 0x0b | 11 | LINE TABULATION (VT) | \u0011 |
^L | FF | 0x0c | 12 | FORM FEED (FF) | \u0012 |
^M | CR | 0x0d | 13 | CARRIAGE RETURN (CR) | \u0013 |
过滤错误数据
使用 regexp_replace(sn,’\u0000’,’’) 进行数据过滤
insert overwrite table ads_t_user_record
select
id,
user_name,
vin,
regexp_replace(sn,'\u0000',''),
user_type,
login_time,
content,
solution
from dwd_t_user_record t
再次执行,同步成功!
🔗 Links
sqoop1实战 定位数据同步错位数据
https://ispong.isxcode.com/hadoop/sqoop/sqoop1实战 定位数据同步错位数据/