使用fastjson读取复杂的JSON格式数据并将结果数据使用spark存入hive表

该文章展示了如何在Scala项目中使用Fastjson库解析复杂的JSON数据,提取所需字段,然后将解析后的数据保存到Hive表中。首先在pom.xml中添加Fastjson依赖,接着通过示例代码说明如何解析嵌套的JSON对象和数组,最后阐述了如何将解析得到的字符串转换为RDD,进而创建DataFrame并利用SparkSQL将数据加载到Hive表中。
摘要由CSDN通过智能技术生成

        

目录

1.导入fastjson包

2.对json数据进行解析

3.将解析之后的数据保存至hive表中


        公司有些数据是以复杂的JSON格式保存的,需要对里面有用的数据进行准确提取

使用的语言为scala

1.导入fastjson包

        在pom.xml文件中的依赖模块加入

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.36</version>
        </dependency>

之后就可以在类中直接导入fastjson包

import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}

2.对json数据进行解析

        复杂的JSON格式数据示例 如下所示

{
    "count": 102,
    "items": [
        {
            "pipeline": 1,
            "dataCorporationId": null,
            "form": {
                "code": "B640312",
                "id": "0342",
                "name": "通讯费用"
                    }
        },
        {
            "pipeline": 2,
            "dataCorporationId": null,
            "form": {
                "code": "B660342",
                "id": "0341",
                "name": "出勤费用"
                    }
        }]
}

比如说我们需要取code的值, 正常的json解析 包括spark对json的数据读取也很难解析出来, 所以选择了fastjson进行辅助,

具体代码如下:

package com.xhgj.bigdata.util

import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}

import scala.collection.mutable.ArrayBuffer

object JsonParse {

  def main(args: Array[String]): Unit = {
    //读取json文件的路径,以本机的json文件作为演示
    val lines: String = Source.fromFile("D:\\resopnses.json").mkString
    get_code(lines)
  }
  def get_code(jsonstr:String) = {
    //将{}的字符串解析成json
    val jsonOBJ: JSONObject = JSON.parseObject(jsonstr)
    //由于items的值是[]组成的需要,获取items下面的jsonobj数组,按照{}来识别的
    val itemsJsonOBJArray: JSONArray = jsonOBJ.getJSONArray("items")
    //获取总共有几个json数组(示例中有两个单位)
    val len = itemsJsonOBJArray.length
    //循环获取每个json
    for (i <- 0 until len ){
     //按照输入的i来获取指定下标的json
      val firstjsonOBJ = itemsJsonOBJArray.getJSONObject(i)
      //获取key为form的值字符串
      val obj1: String = firstjsonOBJ.getString("form")
       //对获取的值进行JSON解析
      val formjsonOBJ = JSON.parseObject(obj1)
        //获取最终索要的数据
      val code = formjsonOBJ.getString("code")
      println("code=" + code)
     }
  }
}

执行结果为

总而言之,

  1. 遇到{}花括号, 需要将其getString变成字符串,再解析成jsonObject
  2. 遇到[]方括号,需要将其解析成.getJSONArray,再取下标获取对应的JSON解析, 剩下的以此类推,再复杂的json串也能解析出来

3.将解析之后的数据保存至hive表中

        由于上面获取的都是string格式, 我们需要将其转换成RDD再转换成DataFrame格式, 因为我使用的是sparksql

       在生产中, 肯定取的不是一个字段, 而是多个, 则需要做额外处理:


//就在上方代码补充即可,比如还需要这几个字段
//先在for循环语句上方加入,需要返回三个字段
val arrb = new ArrayBuffer[(String, String, String)]()
//在for语句内部增加    
      val id = formjsonOBJ.getString("id")
      val name = formjsonOBJ.getString("name")
      arrb.append((code,id ,name ))
//在for语句之后增加
    arrb.toArray

        此时我们写的这个方法返回的是一个Array[(String, String, String)]类型, 我们就可以返回spark代码中, 将这个数据解析成RDD,再使用createDataFrame转换成DF格式, 最后使用sparksql将数据导入hive表中, 代码如下:

import com.xhgj.bigdata.util.{JsonParse, TableName}
import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import scala.io.Source

object TEST {
  def main(args: Array[String]): Unit = {
    //创建schema, 用于rdd转df
    val schema = StructType(Array(
      StructField("code", StringType, nullable = true),
      StructField("id", StringType, nullable = true),
      StructField("name", StringType, nullable = true)
    ))
    val spark = SparkSession.builder().appName("Spark Hive DEMO").enableHiveSupport().getOrCreate()
    val sc = spark.sparkContext
    //读取json数据
    val lines: String = Source.fromFile("D:\\result.json").mkString
    //执行之前写的方法,并将返回的array数组一个个解析成RDD格式
    val res = sc.parallelize(JsonParse.get_code(lines))
    val resRDD = res.map(tup => Row(tup._1,tup._2,tup._3,tup._4,tup._5))
    //rdd转df
    val resDF: DataFrame = spark.createDataFrame(resRDD,schema)
    run(resDF,spark)
    sc.stop()
    spark.stop()
  }
    //sparksql方法将数据转入hive表
  def run(resDF: DataFrame,spark:SparkSession): Unit = {
    resDF.createOrReplaceTempView("FEETY")
 
    spark.sql(
      s"""
        |INSERT OVERWRITE TABLE MYTEST.TABLENAME
        |SELECT
        | *
        |FROM
        | FEETY
        |""".stripMargin)
  }
}

至此, 复杂json格式解析搞定

### 回答1: Fastjson是阿里巴巴的一个开源的Java库,可以用于解析和生成JSON数据。解析复杂JSON数据需要创建一个Java类来映射JSON数据的结构,然后使用Fastjson API将JSON字符串解析为Java对象。如果你想要解析一个复杂JSON数据,你可以尝试如下方法: 1. 定义一个Java类来映射JSON数据的结构。每一个字段对应一个键值对。 2. 使用Fastjson的API,如parseObject,将JSON字符串解析为一个Java对象。 3. 使用解析后的Java对象访问数据。 代码示例: ``` String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; //1. 定义一个Java类来映射JSON数据的结构 class User { private String name; private int age; private String city; //getters and setters } //2. 使用Fastjson的API,将JSON字符串解析为一个Java对象 User user = JSON.parseObject(json, User.class); //3. 使用解析后的Java对象访问数据 System.out.println(user.getName()); System.out.println(user.getAge()); System.out.println(user.getCity()); ``` ### 回答2: Fastjson是一个Java的解析JSON库,它快速、稳定、易用,可以处理各种复杂JSON数据结构。Fastjson的解析速度非常快,可以提高程序的性能,大大减少了JSON数据解析与Java对象转换的时间,利用了Java语言的强大性能优势,使得Fastjson成为了一款非常受欢迎的JSON解析库之一。 Fastjson可以快速处理各种JSON数据格式,包括对象、数组、字符串、数字等,可以轻松地将JSON数据转换为Java对象或Map,也可以将Java对象转换为JSON字符串。Fastjson采用的是基于Bean的转换,即将JSON数据转换为Java对象时,会根据JSON数据自动创建Java对象,并将JSON数据中的字段映射到Java对象中对应的属性中。 Fastjson可以解析复杂JSON数据,例如包含嵌套对象和数组的JSON数据Fastjson提供了很多高级的特性,例如自动类型识别、处理循环引用、支持序列化与反序列化、支持自定义序列化规则等,这些特性使得Fastjson在处理复杂JSON数据结构时更为灵活和可靠。 Fastjson还可以通过注解的方式来设置Java对象与JSON数据之间的映射规则,提高了程序的可维护性和可读性。通过注解可以自动设置Java属性与JSON字段之间的映射,也可以忽略不需要的属性,还可以自定义转换器来实现自定义的序列化与反序列化规则。 在实际开发中,Fastjson是一款非常实用的JSON解析库,它可以轻松地处理各种复杂JSON数据结构,提高程序的性能和可维护性,方便开发人员快速地开发出高质量的应用程序。 ### 回答3: Fastjson是一种高效且易于使用的Java JSON解析框架。它可以帮助Java开发人员快速地将JSON数据转换为Java对象,同时保持数据的完整性和准确性。 Fastjson支持解析不同复杂度的JSON数据,如简单JSON对象,嵌套的JSON对象,数组和嵌套的数组。为了解析复杂JSON数据Fastjson提供了几种重要的功能和API: 1. JSON对象和JSON数组 对于一个复杂JSON数据,它可能包含许多嵌套的JSON对象和JSON数组。Fastjson提供了JSONObject和JSONArray类,可以帮助我们处理这些结构数据。我们可以使用getJSONObject()和getJSONArray()方法从JSONObject或JSONArray中获取子对象和子数组。 2.反序列化 反序列化是将JSON数据转换为Java对象的过程。Fastjson提供了一个JSON.parseObject()方法,可以将JSON字符串转换为Java对象。例如,我们可以使用下面的代码将一个复杂JSON字符串解析为一个Java对象: String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\"}}"; Person person = JSON.parseObject(jsonString, Person.class); 3.注解 Fastjson提供了一些注解来帮助Java开发人员更灵活地控制对象的转换和序列化过程。例如,@JSONField注解可以指定JSON字段的名称和顺序,@JSONCreator注解可以指定一个特殊的构造函数,用于反序列化操作。 4.特殊对象转换器 有些复杂JSON数据可能包含自定义的对象类型,无法直接通过Fastjson的默认转换器进行序列化和反序列化。Fastjson提供了ObjectSerializer和ObjectDeserializer接口,可以实现自定义的对象转换器。 总之,Fastjson是一种非常强大、稳定和易于使用JSON框架,可以帮助Java开发人员快速高效地处理复杂和大数据量的JSON数据。它的灵活性和可定制性也让它成为许多企业级应用程序中首选的JSON解析库。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值