Sqoop抽取文本数据到hive由于存在空字符导致字段错位和丢失错误

用sqoop抽取数据的时候,若记录中含有“由空格组成的字符串”,由于空字符串是由引号括起来,因此,需要对引号进行转义。否则sqoop 完成后, hive加载hdfs文件时,会自动对其截断,从而导致字段数增多。
解决的办法分为2步 :
1、建表的时候设定escaped 属性:escaped by '\\'。
eg:
row format delimited
fields terminated by '\t'
escaped by '\\'
stored as textfile
2、在sqoop命令中添加 --escaped by '\\' 。eg:
sqoop import --connect jdbc:mysql://192.168.200.189:3306/mobile_statistics --username root --password root --query "select id,number,password,member_id,admin_id,transfer_time,face_ico,name,nike_name,sex,birthday,title,phone,email,address,country,state,city,area,status,user_type,source,try_num,try_day,machine_code,first_login_time,last_login_time,login_times,create_time,last_access from app_user_test5 where FROM_UNIXTIME(create_time/1000,'%Y%m%d')=$stDate and \$CONDITIONS" --split-by id --null-string '\\N' --null-non-string '\\N' --fields-terminated-by '\t' --escaped-by '\\' --target-dir "/user/hive/warehouse/mobile.db/app_user_test5"

如果在建表的时候,没有设置escaped属性,而sqoop的时候,设置了escaped-by 属性,则可以直接对表进行alter 操作,添加对‘“ ’字符的转义如:
ALTER TABLE app_user_test SET SERDEPROPERTIES ('escape.delim' = '\\')
效果如下:
Sqoop抽取文本数据到hive由于存在空字符导致字段错位和丢失错误_第1张图片

最终数据库中查出来的结果为:
可以看到,NULL 全表示成了 \N
Sqoop抽取文本数据到hive由于存在空字符导致字段错位和丢失错误_第2张图片
方法二、
步骤同方法1. 不过转义字符为设置‘“’。如escaped by '"'。最终的效果如下:
Sqoop抽取文本数据到hive由于存在空字符导致字段错位和丢失错误_第3张图片
可以看到,唯一的区别是方法一中的\N ,此处为NULL。故该方法的实质是将传入的字段作为字符串处理,添加“”,从而保留其原本的内容。

相对两种方法,建议使用方法一。


你可能感兴趣的:(Sqoop)