我需要把json写给Avro。我正在使用this库来更轻松地使用scala。
我有以下代码段:
case class FriendRequestAcceptedGson(
AppId: Int, CallingAppId: Int, Platform: Int, EventId: Int, Event: String,
EventTimestamp: Long, EventTxnId: String, UserId: String, SessionId: String,
TrackerVersion: String, CollectorVersion: String, EtlVersion: String,
MktMedium: String, MktSource: Int, MktTerm: String, MktContent: String,
MktCampain: String,FromUserId: String, ToUserId: String)
val json =
"""{
"AppId": 3,
"CallingAppId": 3,
"Platform": 1,
"EventId": 1601,
"Event": "FRIEND_REQUEST_ACCEPTED",
"EventTimestamp": 12345,
"EventTxnId": "0D4F2FA0-05CF-11E4-9191-0800200C9A66",
"UserId":"m64761362002",
"SessionId":"337be570-d9e6-11e3-9def-0015c5ff1d1f",
"TrackerVersion": "proxy",
"CollectorVersion": "flume",
"EtlVersion": "json-hdfs",
"MktMedium": "cpc",
"MktSource": 1,
"MktTerm": "abc",
"MktContent": "abc",
"MktCampaign": "def",
"FromUserId":"m733999",
"ToUserId":"m11114444"
}"""
val avroType = AvroType[FriendRequestAcceptedGson]
avroType.io.readJson(json) match {
case Success(readResult) => {
println(readResult)
val outStream: java.io.OutputStream = new FileOutputStream("FriendRequestAcceptedGson.avro")
avroType.io.write(readResult, outStream)
outStream.close
}
case Failure(cause) => print("Failed: "); print(cause)
}
但是当我尝试将Avrotools与刚生成的Avro文件一起使用时,我得到了这个错误:
[lee@lee etl]$ java -jar avro-tools-1.7.7.jar tojson FriendRequestAcceptedGson.avro
Exception in thread "main" java.io.IOException: Not an Avro data file
at org.apache.avro.file.DataFileReader.openReader(DataFileReader.java:63)
at org.apache.avro.tool.DataFileReadTool.run(DataFileReadTool.java:71)
at org.apache.avro.tool.Main.run(Main.java:84)
at org.apache.avro.tool.Main.main(Main.java:73)
我做错了什么? This是我正在使用的库中的方法
答案 0 :(得分:1)
Scalavro很棒!但是现在它无法写出正确的数据文件(它写了avros,但没有标题信息)。
在一个很棒的人提供该功能之前,您可以通过以下方式在Scala中编写avro数据文件(即使用Scala案例类来表示记录):
a)使用case class FriendRequestAcceptedGson
注释@AvroRecord
并使用标准Java Avro写入these tests中的文件。
b)勇敢地尝试这个相对未经测试的Salat-Avro分叉。