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

1.png

2.png

3.png

4.png

定位到错误代码 ads_t_user_record.java566 行报错

定位错误字段
# 找到对象文件
find / -name "ads_t_user_record.java"
vim /tmp/sqoop-ispong/compile/514da556fa1079f96ca28d153cf9d243/ads_t_user_record.java
# set number
# : 566

user_type 翻译错误将日期强转成数据类型

5.png

定位具体错误数据
-- 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 ~/

6.png

找到原因
# 打开文件仔细观察
vim ~/part-00000-85cb4c54-27a8-4165-98b1-6fa23ce1f900-c000

sn 字段存在特殊字符 ^@

7.png

特殊字符对照表
特殊字符 编码 编码 编码 编码 编码
^@ 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

再次执行,同步成功!


sqoop1实战 定位数据同步错位数据
https://ispong.isxcode.com/hadoop/sqoop/sqoop1实战 定位数据同步错位数据/
Author
ispong
Posted on
April 11, 2022
Licensed under