2014-10-29 73 views
1

我需要寫json給Avro。我正在使用this庫來使它更容易與scala一起工作。不能寫avro文件

我有下面的代碼片段:

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的文件,然後我得到這個錯誤:

[[email protected] 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

Scalavro太棒了!但現在它不能編寫正確的數據文件(它寫入avros,但沒有頭信息)。

一)註釋您case class FriendRequestAcceptedGson@AvroRecord,並使用標準的Java的Avro到:

直到一個真棒人有助於該功能,你可以在Scala中通過寫Avro的數據文件(即使用Scala的case類來表示記錄)寫入文件,如these tests

b)勇於嘗試這種相對未經測試的Salat-Avro