【发布时间】:2016-12-12 03:46:08
【问题描述】:
我有一个自定义类型,它通过PCollections 传递并用@DefaultCoder(AvroCoder.class) 进行注释 - 此类型包含一些原语以及使用阅读器从JSON 字符串中提取的Map<String, Object>。
最初读取时,来自 JSON 的类型信息被保留,因此,我可以将值转换为 String 或任何其他适用的类型。但是在管道的后期阶段,当我将相同的值转换为 String 时,我得到了一个类似 java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.String 的异常——这可能意味着 Map 中每个对象的类型信息尚未在管道。这是 AvroCoder 的限制 - 如果是这样,是否有解决方法或者我做错了什么? Map 值将具有不同类型(从 JSON 读取),包括 String、int、double - 因此我需要继续使用 Object 类型。
为了验证编码器的行为,我构建了一个示例程序来模仿该行为并最终得到ClassCastException,如上所述。
String filename = "out.avro";
AvroCoder<Object> coder = AvroCoder.of(TypeDescriptor.of(Object.class));
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
coder.encode("test", oos, new Coder.Context(true));
oos.close();
fos.close();
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println((String) coder.decode(ois, new Coder.Context(true)));
【问题讨论】:
标签: avro google-cloud-dataflow