我有app允许在运行时通过maven原型创建TupleI<x,y,z>
数据类型。通过java反射,我知道x,y,z等最终的原始数据类型。我也知道x,y或z等最终是否也被定义为元组。当我尝试在扩展RichMapFunction<Tuple<x,y,z>>
的类下映射源输入中的值时出现问题 - 即我可以使用tuple.setfield(aValue,position)将源映射到主元组定义,但是如果主元组定义则不行定义包含嵌套元组,即没有tuple.setField(aValue,1).setfield(“”,0)。在这种情况下,我们尝试将元组中的第一个数据的值设置为在字段1处具有元组,因此有点像: - Tuple2<String,Tuple1<Integer>>
。任何可能的方式。 (记住,不能将字段称为f0,f1,f2等,因为sthey可能在运行时不存在,因此应用程序永远不会编译。我可以编写一些创建方法的东西,可以引用f0,f1,f2,即尽可能多的在创建应用程序之前将其注入原型之前需要a - 但是当我所做的一切都设置了一个众所周知的值时,这是一项相当大的工作和听起来很冒险。
答案 0 :(得分:0)
如果它有助于任何人下线,或者为了获得可能更好的响应,我个人感兴趣,这种代码(不是很漂亮)最终完成了这项工作: -
public Tuple1<?> getTuple1 (Object f1) {
return Tuple1.of(f1);
}
public Tuple2<?,?> getTuple2 (Object f1, Object f2) {
return Tuple2.of(f1,f2);
}
public Tuple3<?,?,?> getTuple3 (Object f1, Object f2, Object f3) {
return Tuple3.of(f1,f2,f3);
}
随时随地继续前进。当然,当你来填充实际值时,你的setField()调用必须匹配内部字段的类型和它所期望的数据类型 - 否则一个类强制转换等着你。但这不是一个问题,因为你试图动态填充的Flink元组知道它被声明为什么,所以忽略了你创建了Object类型的字段并默认字符串的事实,并且非常高兴地接受你的相应数据的解析值type - so如果你声明一个Tuple1,它会很乐意接受你的字符串对象上的Interger字段值,毫无疑问,这就像它抛出所说的类别一样。它的工作原理很奇怪,即你不能进入并将嵌套值设置为已知类型,你需要这个Object to String To ActualDataType kludge。 (或者至少我做过)