最近在做hive数据导出的时候,发现有很多数据行存在不一致的编码的类型,导致编码转换的时候,遇到错误,比如一行数据中又存在utf8编码的数据,又存在gbk编码的数据,而对于中文来说,gbk和utf8的编码是不一样的。所以一旦为gbk的数据用utf8进行解码的时候,会报错。因此,需要将这部分混在utf8编码数据中的gbk编码数据剔除掉。
利用python脚本,然后进行transform,来完成剔除的步骤。
代码如下,利用原理,就是进行decode解码的时候,如果解码错误,则表示非utf8字符类型。
#!/usr/bin/python
import sys
import datetime
UTF8='utf8'
OTHER='other'
for line in sys.stdin:
try:
line = line.strip()
arr = line.split('\t')
item=""
for item in arr:
item.decode(UTF8)
print UTF8+"\t"+arr[0]
except UnicodeDecodeError:
print OTHER+"\t"+arr[0]
except:
print OTHER+"\t"+arr[0]
在hive中使用如下:
SELECT
a.member_seq
from
(
select
TRANSFORM (
member_id
,member_seq
,mem_en_first_name
,mem_en_last_name
,member_status
,member_gmt_create
,mem_country_id
,country_accord_name
,mem_email)
USING 'python UTF8Decode.py'
AS code_flag,member_seq
FROM tdl_en_edm_for_eve_mem_tmp2 t1
)a
where a.code_flag='utf8'
其实这还是做的比较简单的,如果能够扩展下,判断每个字段的编码的类型,应该就更加棒了。