2017-06-01 28 views
0

我想讀avro文件,案例類:UserItemIds包括案例類類型:Usersbtscala 2.11弗林克讀取自定義類型 - 內含價值的錯誤:'產生的原因:java.lang.NoSuchMethodException:<init>()`

case class User(id: Long, description: String) 

case class UserItemIds(user: User, itemIds: List[Long]) 


val UserItemIdsInputStream = env.createInput(new AvroInputFormat[UserItemIds](user_item_ids_In, classOf[UserItemIds])) 

UserItemIdsInputStream.print() 

但收到:錯誤:

Caused by: java.lang.NoSuchMethodException: schema.User.<init>() 

任何人都可以指導我如何使用這些類型的工作嗎?此示例使用avro文件,但這可能是parquet或任何自定義DB輸入。

我需要使用TypeInformation嗎?例如:如果是,該怎麼辦?

val tupleInfo: TypeInformation[(User, List[Long])] = createTypeInformation[(User, List[Long])] 

我也看到了env.registerType(),它是否與所有問題有關?任何幫助是極大的讚賞。

我找到了解決這個java errorAdding a default constructor在這種情況下,我將它添加到同伴對象

object UserItemIds{ 
case class UserItemIds(
         user: User, 
         itemIds: List[Long]) 
     def apply(user:User,itemIds:List[Long]) = new 
     UserItemIds(user,itemIds)} 

添加工廠方法scalacase class但這並沒有解決這個問題

回答

1

你有爲UserUserItemIds類型添加默認構造函數。這可能看起來如下:

case class User(id: Long, description: String) { 
    def this() = this(0L, "") 
} 

case class UserItemIds(user: User, itemIds: List[Long]) { 
    def this() = this(new User(), List()) 
}