[Spark] json解析

[Spark] json解析

2020/10/17

  • sql 直接解析

    利用get_json_object(json, '$.field')

    val sql =
        """
          |select 
          |       get_json_object(json_data, '$.name') as name,
          |       get_json_object(json_data, '$.sex') as sex,
          |       get_json_object(json_data, '$.age') as age,
          |       get_json_object(json_data, '$.height') as height,
          |       get_json_object(json_data, '$.weight') as weight,
          |       key
          |from database.table
          |where day = '2020-10-15'
          |""".stripMargin
    println(s"sql: ${sql}")
          
    val res = hiveContext.sql(sql).map(x => {
        val name = x.getString(0)
        val sex = x.getString(1)
        val age = x.getString(2).toInt
        val height = x.getString(3).toInt
        val weight = x.getString(4).toInt
        val key = x.getString(5).toInt
       (key, name, sex, age, height, weight)
    }).persist(StorageLevel.MEMORY_ONLY)
    

    注意: 从 json 中解析出来的字段,要先用 x.getString(0),之后再用 .toInt 等转换为对应的数据类型。不可以直接 .getAs[Int](0) 或者 getInt(0),会报错误(类型转换错误,String不可以转换为Double)

  • 借助spark + alibaba.fastjson解析

    package com.simida
    import com.alibaba.fastjson.JSON	// 引入json类库
    import org.apache.spark.{SparkConf, SparkContext}
    import org.apache.spark.sql.hive.HiveContext 
    
    object ParseJsonData {
      def main(args: Array[String]): Unit = {
            val sparkConf = new SparkConf().setAppName(this.getClass.getSimpleName)
            val sc = new SparkContext(sparkConf)
            val hiveContext = new HiveContext(sc)
        val sql =
            s"""
              |select json_data,
              |       key
              |from database.table
              |where day = '2020-10-15'
              |""".stripMargin
        println(s"sql: ${sql}")
    
        val res = hiveContext.sql(sql).map(x => {
            val json_data = x.getString(0)
            val key = x.getString(1)
            val name = JSON.parseObject(json_data).getString("name")
            val sex = JSON.parseObject(json_data).getString("sex")
            val age = JSON.parseObject(json_data).getString("age")
            val height = JSON.parseObject(json_data).getString("height")
            val weight = JSON.parseObject(json_data).getString("weight")
            (key, json_data, name, sex, age, height, weight)
        })
    	}
    }
    

以上两者最终数据等价。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值