我正在使用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可以处理这样的泛型类吗?如果可以,我目前做错了什么?
答案 0 :(得分:0)
将Class<Type2>
投射到Class<Type1>
中并不一定安全。即使Type2
是Type1
的子类,也取决于[方差](
关于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实现这一目标的方法?