无法写一个avro文件

时间:2014-10-29 11:33:20

标签: java scala avro

我需要把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是我正在使用的库中的方法

1 个答案:

答案 0 :(得分:1)

Scalavro很棒!但是现在它无法写出正确的数据文件(它写了avros,但没有标题信息)。

在一个很棒的人提供该功能之前,您可以通过以下方式在Scala中编写avro数据文件(即使用Scala案例类来表示记录):

a)使用case class FriendRequestAcceptedGson注释@AvroRecord并使用标准Java Avro写入these tests中的文件。

b)勇敢地尝试这个相对未经测试的Salat-Avro分叉。