scala数据格式转换

操作json

json取嵌套value,修改某个字段,新增key value

思路是在ObjectNode可以进行操作

数据源片段的代码

override def source(): DStream[_] = new KafkaDataSource(kconfig, SparkEnv.getStreamingContext()).createKafkaDstream(kconfig.getProducerTopic).filter(_ != null).
  mapPartitions(messages => {
    val objectMapper: ObjectMapper = new ObjectMapper()
    messages.map(message => {
      try {
        val a = 11
        objectMapper.readTree(message.value().toString)
      } catch {
        case ex: JsonProcessingException => null
      }
    }).
      filter(_ != null)
  })

计算时的逻辑

import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}

override def compute(stream: DStream[_]): Unit ={
    val context = SparkContext.getOrCreate()
    val kafkaProducer = new AlarmProducerKafka[String, String](kconfig)
    producer = Some(context.broadcast(kafkaProducer))
    stream.foreachRDD(rdd => {

      val bigDataObjectMapper: ObjectMapper = new ObjectMapper()
      bigDataObjectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
      rdd.foreachPartition(partitionOfRecords => {
        partitionOfRecords.foreach(r => {
         /**
            * 此时的r不能直接操作,通过writeValueAsString 转成String后再转成JsonNode
            * 
            * 要是想在原有的json字符串中添加需要转成ObjectNode,此时调用put方法即可添加元素
            */
            
          val c = bigDataObjectMapper.writeValueAsString(r)
          val messages : JsonNode = bigDataObjectMapper.readTree(c)

         val captureLibResultNode:ObjectNode =  messages.path("captureLibResult").get(0).asInstanceOf[ObjectNode]
          captureLibResultNode.put("newKey",12)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值