[英]Flink Scala ClassNotFoundException: org.apache.flink.api.common.typeinfo.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.