导入hive中的数据默认的列分隔符是'\001',默认的行分隔符是'\n'。如果导入的数据中有'\n',hive会认为一行已经结束,后面的数据被分割成下一行。这种情况下,导入之后hive中数据的行数就比原先数据库中的多,而且会出现数据不一致的情况。
sqoop在导入时可以指定分隔符和换行符,参数--fields-terminated-by和 --lines-terminated-by分别自定义行分隔符和列分隔符,虽然通过 --lines-terminated-by指定了其他的字符作为行分隔符,但是不起作用,因为hive只支持'\n'作为行分隔符。简单的解决办法就是加上参数 --hive-drop-import-delims来把导入数据中包含\n 分隔符去掉。
这样一般情况就不会出问题了,但是我在实际操作过程中还是遇到了指定--hive-drop-import-delims这一参数后还是出现了多一行的问题。
问题描述:sqoop将mysql数据导入到hive的外表,在导入的过程中指定了各种参数,还是出现了多一条的问题,导入语句
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--hive-import \
--connect jdbc:mysql://localhost:3306/databaseName?characterEncoding=UTF-8 \
--username **** \
--password ****\
--query "select * from tableName where \$CONDITIONS" \
--hive-import -m 3 \
--split-by id \
--hive-database hiveDatabaseName \
--hive-table hiveTableName \
--target-dir /*/* \
--fields-terminated-by "\t" \
--hive-drop-import-delims \
--lines-terminated-by "\n" \
--delete-target-dir
试了各种参数改变,最后将"-m 3"改为"-m 1"解决了这多一条的问题,原因不知道,猜测大概是因为分隔数据的id不是数字类型导致的,以为如果id不是int类型,mr在将数据分成3份的时候不能更好的处理,所以-m 1 只进行一个任务就不会出现数据错乱了。如果你知道为什么,可以留言,谢谢!