我有一个在json文件中描述的表,并且基于我想要稍后创建一个集合作为sideInput。
PCollection<KV<Boolean, Map<String, Object>>> pC = p_jsonstring
.apply("create ...", MapElements.via( (String input) -> {
try {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> mytable =
mapper.readValue(input, new TypeReference<Map<String, Object>>(){});
Boolean key = (Boolean) mytable.get("mykey");
return KV.of(key, mytable);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}).withOutputType(new TypeDescriptor<KV<Boolean, Map<String, Object>>>() {}));
运行时,我有以下错误消息:
严重:无法为创建KV ../ Map.out [PCollection]返回默认编码器。更正以下根本原因之一: 没有手动指定编码器;你可以使用.setCoder()来完成。 从CoderRegistry推断编码器失败:无法为org.apache.beam.sdk.values.KV&gt;提供默认编码器。更正以下根本原因之一: 使用已注册的CoderFactory构建编码器失败:无法为参数化类型提供编码器org.apache.beam.sdk.values.KV&gt;:无法为java.util.Map提供默认编码器。更正以下根本原因之一: 使用已注册的CoderFactory构建编码器失败:无法为参数化类型java.util.Map提供编码器:无法为java.lang.Object提供默认编码器。更正以下根本原因之一: 使用已注册的CoderFactory构建编码器失败:无法使用类java.lang.Object提供基于值的编码器:没有为该类注册CoderFactory。 从@DefaultCoder注释构建编码器失败:类java.lang.Object没有@DefaultCoder注释。
我认为问题主要与Object
中的Map<String, Object>
有关,但在我的情况下,映射值仅在运行时从文件中读取json字符串时确定。 Object类型可以是string,number或boolean。
有什么建议吗?
答案 0 :(得分:0)
我认为罐头TypeDescriptors.kvs在这里应作为您的输出类型使用,您可以考虑将输入String作为String保留在Map值中,并在实际要处理该对象时反序列化。如果只想在此处反序列化,请考虑为反序列化的对象创建一个Schema,并使用Row作为您的值类。您可以generate a Coder from that Schema