背景:
Sparkstreaming計算完成的數據封裝成對象后需要轉換成json並輸出到Redis
問題:
1、scala對象無法序列化
2、sclaa對象序列化后為空
解決方案:
1、樣例類必須加上注解@BeanProperty,這樣scala的類中的屬性就有了get,set方法
case class ItemRelevant( @BeanProperty anchorId: Long = 0L, //主播id @BeanProperty liveId: Long, //直播id @BeanProperty itemId: Long, //商品id @BeanProperty itemName: String, //商品名字 @BeanProperty itemPrice: Double, //商品直播價格 @BeanProperty shopName: String, //店鋪名字 @BeanProperty cateName: String, //商品類目 @BeanProperty upTime: String, //商品上架時間 @BeanProperty image: String, //商品圖片 @BeanProperty var saleNum: Long = 0L, //商品實時銷量 @BeanProperty var salesVolume: Double = 0.0, //商品實時銷售額 //機器本地時間 2020-10-09 使用此樣例類,此參數不需要傳入 @BeanProperty var dayString: String = null, //年月日 //機器本地時間 11:20:30 使用此樣例類,此參數不需要傳入 @BeanProperty var hmString: String = null) { //時分秒 val date = new Date(System.currentTimeMillis()) dayString = new SimpleDateFormat("yyyy-MM-dd").format(date) hmString = new SimpleDateFormat("HH:mm:ss").format(date) }
2、本次采用的是fastjosn的方式將scala的對象轉換成json並輸出,值得注意的是,使用scala代碼需要指定JSON.toJSONString的第二的參數,否則,對象的屬性的值為空,第二個參數部分列舉如下:
名稱 | 含義 |
QuoteFieldNames | 輸出key時是否使用雙引號,默認為true |
UseSingleQuotes | 使用單引號而不是雙引號,默認為false |
WriteMapNullValue | 是否輸出值為null的字段,默認為false |
WriteEnumUsingToString | Enum輸出name()或者original,默認為false |
SortField | 按字段名稱排序后輸出。默認為false |
WriteTabAsSpecial | 把\t做轉義輸出,默認為false |
PrettyForma | 結果是否格式化,默認為false |
WriteClassName | 序列化時寫入類型信息,默認為false。反序列化是需用到 |
3、此時有一個對象x是ItemRelevant類,那么x轉換成json格式的代碼如下:
val y = JSON.toJSONString(x, SerializerFeature.PrettyFormat)