繁体   English   中英

Flink 中的 TypeInformation 动态比较数据类型

[英]TypeInformation in Flink to compare the datatypes dynamically

我有一个管道,数据以JSON格式从Flink发送到Kafka主题。 我还能够从 Kafka 主题中获取它,并且还能够获取 JSON 属性。 现在,就像scala reflect类,我也可以在运行时比较数据类型,我试图在 Fink 中使用TypeInformation做同样的事情,我可以设置一些预定义的格式,并且从主题中读取的任何数据都应该在这个Validation下 go 和应该相应地通过或失败。 我有如下数据:。
{"policyName":"String", "premium":2400, "eventTime":"2021-12-22 00:00:00" }

对于我的问题,我在Flink's book遇到了几个示例,其中提到了如何创建TypeInformation variable ,但没有提到如何使用它,所以我尝试了我的方法:

    val objectMapper = new ObjectMapper()

    val tupleType: TypeInformation[(String, String, String)] =
    Types.TUPLE[(String, Int, String)]
    println(tupleType.getTypeClass)
    
    src.map(v => v)
      .map { x =>
        val policyName: String = objectMapper.readTree(x).get("policyName").toString()
        val premium: Int = objectMapper.readTree(x).get("premium").toString().toInt
        val eventTime: String = objectMapper.readTree(x).get("eventTime").toString()
        if ((policyName, premium, eventTime)== tupleType.getTypeClass) {
          println("Good Record: " + (policyName, premium, eventTime))
        }
        else {
          println("Bad Record: " + (id, category, eventTime))
        }
      } 

现在,如果我将如下输入传递给 flink kafka 生产者:

{"policyName":"whatever you feel like","premium":"4000","eventTime":"2021-12-20 00:00:00"}

它应该给我预期的 output 作为"Bad record" and the tuple ,因为溢价的数据类型是字符串而不是长/整数。

如果通过输入如下:

{"policyName":"whatever you feel like","premium":4000,"eventTime":"2021-12-20 00:00:00"}

它应该给我 output 作为"Good Record" and the tuple

但根据我的代码,它总是给我 else 部分。

如果我创建一个datastream变量并存储上述map的结果,然后进行如下比较,那么它会给我正确的结果:

if (tupleType == datas.getType()) { //where 'datas' is a datastream
      print("Good Records")
    } else {
      println("Bad Records")
    }  

但我想将good/bad记录发送到different stream或者可以直接插入Cassandra表中。 所以,这就是我使用循环来一一识别记录的原因。 我的方法正确吗? 考虑到我想要实现的目标,最佳实践是什么?

我真的不认为使用TypeInformation来做你想做的事是最好的主意。 您可以简单地使用类似ProcessFunction的东西来接受 JSON String ,然后使用ObjectMapper将 JSON 反序列化为具有预期结构的 class。 您可以 output 来自ProcessFunction的正确反序列化对象和反序列化失败的字符串可以作为侧 output 被忽略,因为它们将是 Your Bad Records

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM