作者:幽鸿
最近在使用Sqoop的时候,发现从MySql导入到Hive的数据莫名其妙会多少好多,并且没有任何规律可循。最后观察发现是由于MySql中存储的一个大字段中含有若干干扰字符导致而成:
而Hive在碰到\n\r等的时候,会被默认识别为换行,即一条数据可能被拆分成多条数据。而sqoop显然考虑到了这个问题,只需在sqoop中加上--hive-delims-replacement "#"参数就可避免这种问题,但是该字段却不可还原了。对于不可缺少的精确性确实是一种遗憾。
那么如何查看Sqoop导出的源数据呢?我们可以现将数据导入到HDFS,使用-z命令:
sqoop import --connect "jdbc:mysql://$ip:$port/$DBName?useUnicode=true&characterEncoding=utf-8" --username $username --password $password \
--target-dir /apps-data/hduser06/$tablename --table $tablename --columns $columns \
--hive-drop-import-delims --delete-target-dir -m 1 --null-string '\\N' --null-non-string '\\N' -z --where "1=1"
导入数据成功以后,我们可以将数据从/apps-data/hduser06/$tablename路径下download下来,这里使用了-z命令:该命令可以将数据压缩成gizp格式,而sqoop的默认压缩格式是deflate压缩,这种格式我们必须转换才能看,所以加上-z命令后,就可以查看源数据库文件,进行查看数据的具体原因了。
Sqoop在导数据的时候其实还有许多bug的,比如在使用多个map并行导入的时候,由于不能有效识别主键,会有少量重复字段,只好加上“ -m 1”参数。问题虽然解决了,但肯定让人不舒服,既然是分布式系统,为什么不能使用多个map呢?