我有一个问题,我应该将一个对象传递给mapper(hadoop的map reduce),因此我尝试将对象放入这样的json中:
Object2ObjectOpenHashMap<OpenBitSet, CombinationHelper> level1 = ...;
String level1path="pathFile.txt";
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
String JsonLevel1 = gson.toJson(level1);
BufferedWriter writerContainTuples = new BufferedWriter(new FileWriter(level1path));
writerContainTuples.write(JsonLevel1);
writerContainTuples.close();
在mapper中,我通常以这种方式从文件中获取对象:
public void map(Object ke, Text val, Context context) throws IOException, InterruptedException {
level1 = new Gson().fromJson(val.toString(), new TypeToken<Object2ObjectOpenHashMap<OpenBitSet, CombinationHelper>>(){}.getType());
.
.
.
}
}
但是当我运行程序时,它给了我这个错误:
java.lang.Exception: org.apache.hadoop.shaded.com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3
所以我不知道如果java这样给我这个错误,我该如何传递对象。我已经尝试过可序列化,但是在映射器阶段,它给了我几乎相同的错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从错误信息来看,问题在于Gson在尝试反序列化时期望一个JSON对象(BEGIN_OBJECT),但实际上遇到了字符串(STRING)。这通常意味着你的level1
对象被转换为JSON字符串后,可能整个JSON内容被当成了一个单独的字符串值来处理,而不是作为结构化的JSON对象。
确保在写入文件时,你确实得到了一个有效的、结构完整的JSON对象字符串。根据你的代码片段,看起来你已经正确地将level1
转换为了JSON字符串并写入了文件。但是,问题可能出在读取和解析这个JSON字符串上。
这里有几个检查点和建议:
验证生成的JSON:首先确认JsonLevel1
变量中的内容确实是正确的JSON格式。你可以打印出来检查一下,确保它以{
开始,以}
结束,并且内部是合法的键值对结构。
Text vs. BytesWritable:Hadoop的MapReduce框架中,默认的value类型是Text
,它适合处理文本数据。但如果你的JSON字符串非常大或者为了效率考虑,可以考虑使用BytesWritable
,特别是当你知道JSON字符串的大小时。这样可以直接将字节写入,避免了额外的编码解码开销。
直接读取文件内容:确保在Mapper中,你正确地读取了整个文件内容作为单个值处理。如果文件只包含一个大的JSON对象,那么直接用val.toString()
应该是正确的。但如果是多行或者有其他格式要求,可能需要调整读取逻辑。
TypeToken的具体化:在你的反序列化代码中,你使用了一个匿名的TypeToken
。确保这个TypeToken
具体指明了你期望的类型,例如new TypeToken<Object2ObjectOpenHashMap<String, YourObjectType>>(){}.getType()
,其中YourObjectType
是你level1
映射中值的实际类型。
异常处理和日志记录:增加更详细的异常处理和日志记录,可以帮助定位问题所在。特别是在反序列化部分,捕获并打印具体的异常堆栈,可能会揭示更多细节。
如果以上都确认无误,而问题仍然存在,可能需要检查是否有其他环节(如文件读写过程中)引入了意外的字符或格式变化。