我正在编写一个简单的推特程序,我正在使用Kafka阅读推文,并希望使用Avro进行序列化。到目前为止,我刚刚在Scala中设置了twitter配置,现在想要使用此配置阅读推文。
如何在我的程序中导入tweets.avsc文件中定义的以下avro架构?
PFQuery
我在网上发布了一些示例,其中显示了PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query orderByAscending:@"highScore"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *object in objects) {
NSLog(@"High Score is %d", [object["highScore"]intValue]);
}
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
之类的内容,以便在Scala中导入模式,以便我们可以像
{
"namespace": "tweetavro",
"type": "record",
"name": "Tweet",
"fields": [
{"name": "name", "type": "string"},
{"name": "text", "type": "string"}
]
}
我正在遵循相同的规则并在import tweetavro.Tweet
def main (args: Array[String]) {
val twitterStream = TwitterStream.getStream
twitterStream.addListener(new OnTweetPosted(s => sendToKafka(toTweet(s))))
twitterStream.filter(filterUsOnly)
}
private def toTweet(s: Status): Tweet = {
new Tweet(s.getUser.getName, s.getText)
}
private def sendToKafka(t:Tweet) {
println(toJson(t.getSchema).apply(t))
val tweetEnc = toBinary[Tweet].apply(t)
val msg = new KeyedMessage[String, Array[Byte]](KafkaTopic, tweetEnc)
kafkaProducer.send(msg)
}
完成所有这些后,仍然无法做pom.xml
anayone可以帮忙吗?
谢谢!
答案 0 :(得分:3)
您也可以使用avro4s。根据模式定义案例类(或生成它)。我们称之为Tweet
。然后创建一个AvroOutputStream
,它将从案例类中推断出架构,并用于序列化实例。然后我们可以写入一个字节数组,并将其发送给kafka。例如:
val tweet: Tweet= ... // the instance you want to serialize
val out = new ByteArrayOutputStream // we collect the serialized output in this
val avro = AvroOutputStream[Tweet](out) // you specify the type here as well
avro.write(tweet)
avro.close()
val bytes = out.toByteArray
val msg = new KeyedMessage[String, Array[Byte]](KafkaTopic, bytes)
kafkaProducer.send(msg)
答案 1 :(得分:2)
我建议使用Avrohugger。就Avro的Scala案例类而言,它是块中的新手,但支持我需要的一切,我真的很喜欢它不是基于宏的,所以我实际上可以看到生成的内容。
维护人员非常棒,非常接受贡献和反馈。它不是也可能永远不会像官方Java代码那样功能丰富,但它将满足大多数人的需求。
目前,它缺少对联合(除可选类型之外)和递归类型的支持。
SBT插件运行良好,如果您想快速了解它对Avro架构的作用,还有一个新的Web界面:
https://avro2caseclass.herokuapp.com/
此处有更多详情:
答案 2 :(得分:1)
您应该首先将该架构编译为一个类。我不确定Scala中是否有适用于Avro的库,但是您可以生成Java类并在Scala中使用它:
java -jar /path/to/avro-tools-1.7.7.jar compile schema tweet.avsc .
根据您的需要更改此行,您应该获得此工具生成的tweetavro.Tweet类。然后,您可以将它放入项目中,并以您刚才描述的方式使用。
更多信息here
upd:仅供参考,似乎有一个library in Scala,但我以前从未使用过它