在Dataflow

时间:2017-10-03 23:50:24

标签: java generics google-cloud-dataflow apache-beam

我正在使用Apache Beam版本的Dataflow,当我尝试创建输出泛型类的PTransform时,我目前遇到了一个问题。这是一个这种变换的最小例子,它只是重复输出一个类型。

public class BadTransform
    extends PTransform<PCollection<Result>, PCollection<Class<? extends Type1>>> {

  @Override
  public PCollection<Class<? extends Type1>> expand(
      PCollection<Result> input) {
    return input.apply(
        ParDo.of(
            new DoFn<Result, Class<? extends Type1>>() {
              @ProcessElement
              public void processElement(ProcessContext processContext) throws Exception {
                processContext.output(Type2.class);
              }
            }));
  }
}

此转换编译时没有问题,但运行时会产生错误消息java.lang.ClassCastException: org.apache.beam.sdk.repackaged.com.google.common.reflect.Types$WildcardTypeImpl cannot be cast to java.lang.reflect.TypeVariable

我没有专门的编码器。

Beam / Dataflow可以处理这样的泛型类吗?如果可以,我目前做错了什么?

1 个答案:

答案 0 :(得分:0)

Class<Type2>投射到Class<Type1>中并不一定安全。即使Type2Type1的子类,也取决于[方差]( 关于Class<T> Class<Type2>Class<Type1>的子类型,Class<Type1> Class<Type2>的子类型是import pandas as pd # make a simple dataframe df = pd.DataFrame({'a':[1,2], 'b':[3,4]}) df # a b # 0 1 3 # 1 2 4 # create an unattached column with an index df.apply(lambda row: row.a + row.b, axis=1) # 0 4 # 1 6 # do same but attach it to the dataframe df['c'] = df.apply(lambda row: row.a + row.b, axis=1) df # a b c # 0 1 3 4 # 1 2 4 6 的子类型,或者SettingWithCopyWarning可能不合适,https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)} fn = lambda row: row.a + row.b # define a function for the new column col = df.apply(fn, axis=1) # get column data with an index df = df.assign(c=col.values) # assign values to column 'c' }

您是否可以问一个关于您要解决的问题的问题,然后我们可以找出使用Beam实现这一目标的方法?