【问题标题】:Set flink nested tuple value at runtime?在运行时设置 flink 嵌套元组值?
【发布时间】:2018-02-10 17:18:39
【问题描述】:

我的应用程序允许在运行时通过 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 等,因为它们在运行时可能不存在,因此应用程序永远无法编译。我可以编写一些东西来创建可以引用 f0,f1,f2 的方法,即尽可能多a 是必需的,在创建应用程序之前将其注入原型 - 但是当我所做的只是设置一个类众所周知的值时,这是一项相当多的工作并且听起来很冒险。

【问题讨论】:

    标签: java tuples apache-flink


    【解决方案1】:

    如果它对任何人有所帮助,或者出于我个人的兴趣获得可能更好的响应,那么这种代码(不漂亮)最终完成了工作:-

    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 类型的字段和默认字符串这一事实,并且非常高兴地接受了适当数据的解析值类型 - 所以如果你声明一个 Tuple1 ,它会很乐意在你的字符串对象顶部接受一个 Interger 的字段值,毫无疑问,这和它抛出所说的类转换一样好。它的工作原理很奇怪,即您无法进入并将嵌套值设置为已知类型,您需要将此对象转换为 String To ActualDataType kludge。 (或者至少我做到了)

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2021-10-17
      • 2022-11-24
      • 1970-01-01
      • 2019-10-28
      • 2018-01-16
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多