use*_*464 5 google-cloud-platform google-cloud-dataflow
我有两个与我在Dataflow管道中遇到的编码器问题有关的问题.
关于这两个项目的任何帮助都会有所帮助,因为我现在有点困惑.
Ken*_*les 13
看起来你已被两个问题所困扰.感谢您引起我们的注意!幸运的是,在我们改进的过程中,两者都有简单的解决方法.
第一个问题是,默认的编码器注册表不具有映射的条目Set.class
来SetCoder
.我们已经提交了GitHub问题#56来跟踪其解决方案.在此期间,您可以使用以下代码执行所需的注册:
pipeline.getCoderRegistry().registerCoder(Set.class, SetCoder.class);
Run Code Online (Sandbox Code Playgroud)
第二个问题是参数化类型目前需要在编码器注册表中进行高级处理,因此@DefaultCoder
不会受到尊重.我们已经提交了Github问题#57来跟踪这一情况.确保SerializableCoder
在任何地方使用的最佳方法是为您的类型CustomType
注册一个CoderFactory
将返回的类型SerializableCoder
.假设你的类型是这样的:
public class CustomType<T extends Serializable> implements Serializable {
T field;
}
Run Code Online (Sandbox Code Playgroud)
然后,以下代码注册一个CoderFactory
产生适当SerializableCoder
实例的代码:
pipeline.getCoderRegistry().registerCoder(CustomType.class, new CoderFactory() {
@Override
public Coder<?> create(List<? extends Coder<?>>) {
// No matter what the T is, return SerializableCoder
return SerializableCoder.of(CustomType.class);
}
@Override
public List<Object> getInstanceComponents(Object value) {
// Return the T inside your CustomType<T> to enable coder inference for Create
return Collections.singletonList(((CustomType<Object>) value).field);
}
});
Run Code Online (Sandbox Code Playgroud)
现在,无论何时CustomType
在管道中使用,编码器注册表都会生成一个SerializableCoder
.
请注意,这SerializableCoder
不是确定性的(编码对象的字节对于对象不一定相等equals()
),因此使用此编码器编码的值不能用作GroupByKey
操作中的键.
归档时间: |
|
查看次数: |
1162 次 |
最近记录: |