SparkSql 处理json文件案列

package org.example
import java.lang

import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.functions._

object json {
  def main(args: Array[String]): Unit = {
    Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

    var conf = new SparkConf().setAppName("json").setMaster("local")
    var sc = new SparkContext(conf)
    val spark = SparkSession.builder().config(conf).getOrCreate()

    import spark.implicits._
    import org.apache.spark.sql.types._

    //读取文件创建 RDD
    val RDD = sc.textFile("file/input/json.txt")

    //创建 schema
        var schemastring = "Time Comtent"
        val fields = schemastring.split(" ").map(x=>StructField(x,StringType,nullable=true))
        var schema = StructType(fields)

    println("+++++++++++++++++++++++++++DF:创建 DateFrame+++++++++++++++++++++++")
    // 注意:如果用createDataFrame(rowRDD,schema) 则RDD需要 Row
    val rowRDD = RDD.map(_.split("\\|")).map(x=>Row(x(0).trim(),x(1).trim()))
    var opDF = spark.createDataFrame(rowRDD,schema)
    /*
    val rowRDD = RDD.map(_.split("\\|")).map(x => (x(0).trim(), x(1).trim()))
    var opDF = rowRDD.toDF("time","coment")   //或者 var opDF = spark.createDataFrame(rowRDD).toDF("time", "coment")
    */

    opDF.show(1, false)


    //查看第一层
    val opDF1 = opDF.select($"time", get_json_object($"coment", "$.cm").alias("cm"), get_json_object($"coment", "$.ap").alias("ap"),
      get_json_object($"coment", "$.et").alias("et"))
    println("+++++++++++++++++++++++++++DF1: 第一层 +++++++++++++++++++++")
    opDF1.printSchema()
    opDF1.show(10, false)

    //查看第二层
    var opDF2 = opDF1.select($"time", $"ap", get_json_object($"cm", "$.ln").alias("ln"), get_json_object($"cm", "$.sv").alias("sv"),
      get_json_object($"cm", "$.os").alias("os"), get_json_object($"cm", "$.g").alias("g"), get_json_object($"cm", "$.mid").alias("mid"),
      get_json_object($"cm", "$.nw").alias("nw"), get_json_object($"cm", "$.l").alias("l"), get_json_object($"cm", "$.vc").alias("vc"),
      get_json_object($"cm", "$.hw").alias("hw"), get_json_object($"cm", "$.ar").alias("ar"), get_json_object($"cm", "$.uid").alias("uid"),
      get_json_object($"cm", "$.t").alias("t"), get_json_object($"cm", "$.la").alias("la"), get_json_object($"cm", "$.md").alias("md"),
      get_json_object($"cm", "$.vn").alias("vn"), get_json_object($"cm", "$.ba").alias("ba"), get_json_object($"cm", "$.sr").alias("sr"),
      from_json($"et", ArrayType(StructType(StructField("ett", StringType) :: StructField("en", StringType) :: StructField("kv", StringType) :: Nil))).as("events"))
    //val opDF2 = opDF1.select($"time",$"ap",get_json_object($"cm","$.ln").alias("ln"),get_json_object($"cm","$.sv").alias("sv"),get_json_object($"cm","$.os").alias("os"),
    // get_json_object($"cm","$.g").alias("g"),get_json_object($"cm","$.mid").alias("mid"),get_json_object($"cm","$.nw").alias("nw"),get_json_object($"cm","$.l").alias("l"),
    // get_json_object($"cm","$.vc").alias("vc"),get_json_object($"cm","$.hw").alias("hw"),get_json_object($"cm","$.ar").alias("ar"),get_json_object($"cm","$.uid").alias("uid"),
    // get_json_object($"cm","$.t").alias("t"),get_json_object($"cm","$.la").alias("la"),get_json_object($"cm","$.md").alias("md"),get_json_object($"cm","$.vn").alias("vn"),
    // get_json_object($"cm","$.ba").alias("ba"),get_json_object($"cm","$.sr").alias("sr"),
    // from_json($"et",ArrayType(StructType(StructField("ett",StringType)::StructField("en",StringType)::StructField("kv",StringType)::Nil))).as("events"))
    println("+++++++++++++++++++++++++++++++++++DF2:+++++++++++++++++++++++++")
    opDF2.printSchema()
    opDF2.show(10, false)

    //explode
    val opDF3 = opDF2.select($"time", $"ap", $"ln", $"sv", $"os", $"g", $"mid", $"nw", $"l", $"vc", $"hw", $"ar", $"uid", $"t", $"la",
      $"md", $"vn", $"ba", $"sr", explode($"events").as("eventcontent"))
    println("++++++++++++++++++++++++++++++++DF3:++++++++++++++++++++++++++++")
    opDF3.printSchema()
    opDF3.show(10, false)

    //获取第三层,即event
    val opDF4 = opDF3.select($"time", $"ap", $"ln", $"sv", $"os", $"g", $"mid", $"nw", $"l", $"vc", $"hw", $"ar", $"uid", $"t", $"la",
      $"md", $"vn", $"ba", $"sr", $"eventcontent.ett", $"eventcontent.en", $"eventcontent.kv")
    println("+++++++++++++++++++++++++++++++++DF4:+++++++++++++++++++++++++++")
    opDF4.printSchema
    opDF4.show(10, false)


    opDF4.createTempView("cai")
    println("创建临时表以后的数据查询")
    spark.sql("select time,hw from cai").show(10, false)
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要批量处理json文件,你可以使用labelme_json_to_dataset.exe这个工具。这个工具的路径是C:\ProgramData\anaconda3\envs\labelme\Scripts\labelme_json_to_dataset.exe。你可以将要处理json文件放在一个文件夹中,然后使用该工具将这些json文件转化为txt文件。具体的操作步骤如下: 1. 将要处理json文件放在一个文件夹中。 2. 打开命令提示符或终端窗口。 3. 使用cd命令切换到labelme_json_to_dataset.exe所在的路径,即C:\ProgramData\anaconda3\envs\labelme\Scripts\。 4. 运行以下命令来批量处理json文件: labelme_json_to_dataset.exe <json文件所在文件夹路径> <输出txt文件夹路径> 例如,如果你的json文件放在F:\DATA\json文件夹中,想要将转化后的txt文件保存在F:\DATA\txt文件夹中,那么命令应该是: labelme_json_to_dataset.exe F:\DATA\json F:\DATA\txt 5. 程序会自动将json文件转化为txt文件,并保存在指定的输出txt文件夹中。 这样就可以批量处理json文件了。请注意,你需要根据实际情况修改命令中的文件夹路径。 #### 引用[.reference_title] - *1* [批量处理:读取文件夹,将json文件转化为txt文件](https://blog.csdn.net/dally2/article/details/117904166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [labelme标记数据后,批量处理json文件,生成标签](https://blog.csdn.net/hejunran/article/details/118228300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值