如何为KV指定编码器<boolean,map <string,=“”object =“”>&gt;在谷歌梁/数据流

时间:2017-06-19 03:36:50

标签: google-cloud-dataflow apache-beam

我有一个在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。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为罐头TypeDescriptors.kvs在这里应作为您的输出类型使用,您可以考虑将输入String作为String保留在Map值中,并在实际要处理该对象时反序列化。如果只想在此处反序列化,请考虑为反序列化的对象创建一个Schema,并使用Row作为您的值类。您可以generate a Coder from that Schema