我在hdfs中有一个文件,并将其导出到sqoop表。请在下面找到日志详细信息:

Caused by: java.lang.RuntimeException: Can't parse input data: ' characters'
    at tags.__loadFromFields(tags.java:335)
    at tags.parse(tags.java:268)
    at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:89)
    ... 10 more

sqoop导出命令
sqoop export \
--connect "**************************************" \
--username=**** \
--password=***** \
--table tags \
--export-dir /user/cloudera/movie_lens/tags_no_header.csv \
--batch \
--input-lines-terminated-by '\n' \
--input-fields-terminated-by ',' \
--num-mappers 9 \

表结构:
create table tags
    (userId integer
    ,movieId integer
    ,tag varchar(150)
    ,timestamp decimal
    );

记录失败:
660,260,“虚构的世界,人物,故事,哲学” ,1436680217

根据我的理解,由于字符串中间的逗号','引起的模棱两可的解析而导致失败。

在这种情况下,请帮助我了解--input-enclosed-by和--input-escaped-by参数的用法,或者是否有其他解决方案。

最佳答案

我已经使用属性--input-optional-enclosed-by解决了它。
导出命令:

sqoop export \
--connect "jdbc:mysql://quickstart.cloudera:3306/movie_lens_db" \
--username=root \
--password=cloudera \
--table tags \
--export-dir /user/cloudera/escape_by_test.txt \
--batch \
--input-lines-terminated-by '\n' \
--input-fields-terminated-by ',' \
--input-optionally-enclosed-by '\"' \
--num-mappers 1 \
--outdir java_files

表数据:
+--------+---------+---------------------------------------------------+------------+
| userId | movieId | tag                                               | timestamp  |
+--------+---------+---------------------------------------------------+------------+
|    660 |     260 | imaginary world, characters, story, philosophical | 1436680217 |
|    212 |   69712 | genuine characters                                | 1260688086 |
+--------+---------+---------------------------------------------------+------------+

关于hadoop - 从hdfs到MySQL的sqoop导出失败,需要帮助以转义字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43112262/

10-16 21:29