spark中将数据输出到json文件的两种方式

在学习spark时,我们经常遇到要将数据写进一个json文件中的案例。通常的案例就是,给我们一个普通文件,然后我们用sparkcore或者sparkSQL,遍历文件内容后,按照需求将再将遍历后得到的数据写入json文件中。
这里,我主要使用两种方法:
方式一:通过dataframe.write.json()
方式二:使用gson
初始的文件部分内容大概如下所示:

300T|3001003|C2048|||FALSE|D001035|20150109102323|11||12||||12|1|9001|车载主机|1201|1505|无源|1|9001||B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9001|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9001|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2105}|15|||90
300T|3001003|C2049|||FALSE|D001035|20150109102324|12||13||||13|1|9002|车载主机|1202|1505|无源|1|9002||B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9002|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9002|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2106}|15|||90
300T|3001003|C2050||广|FALSE|D001035|20150109102325|13||14||||14|1|9003|车载主机|1203|1505|无源|1|9003|广|B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9003|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9003|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2107}|15||晴天|50
300T|3001003|C2051|||FALSE|D001035|20150109102326|14||15||||15|1|9004|车载主机|1204|1505|无源|1|9004||B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9004|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9004|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2108}|15||大风|30
300T|3001003|C2050|||FALSE|D001035|20150109102327|15||16||||16|1|9005|车载主机|1205|1505|无源|1|9005||B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9005|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9005|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2109}|15||冰雹|80
300T|3001003|C2051|||FALSE|D001035|20150109102328|16||17||||17|1|9006|车载主机|1206|1505|无源|1|9006||B1505|北京南站|道岔|1345|S1345|北京南站|1505|1|9006|116.46|39.92|电源|1345|S1345|北京南站|1505|1|9006|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2110}|15||浮沉|25
300T|3001003|C2048|||FALSE|D001035|20150109102329|17||18||||18|1|9007|车载主机|1207|1505|无源|1|9007||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9007|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9007|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2111}|15||扬沙|26
300T|3001003|C2049|西||FALSE|D001035|20150109102330|18||19||||19|1|9008|车载主机|1208|1505|无源|1|9008||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9008|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9008|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2112}|15||扬沙|27
300T|3001003|C2048|||FALSE|D001035|20150109102331|19||20||||20|1|9009|车载主机|1209|1505|有源|1|9009||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9009|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9009|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2113}|15||扬沙|28
300T|3001003|C2049|||FALSE|D001035|20150109102332|20||21||||21|1|9010|无线传输单元|1210|1505|有源|1|9010||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9010|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9010|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2114}|15||扬沙|29
300T|3001003|C2050|||FALSE|D001035|20150109102333|21||22||||22|1|9011|无线传输单元|1211|1505|有源|1|9011||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9011|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9011|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2115}|15||扬沙|30
300T|3001003|C2050|广||FALSE|D001035|20150109102334|22||23||||23|1|9012|无线传输单元|1212|1505|有源|1|9012||B1505|北京南站|转辙机|1345|S1345|北京南站|1505|1|9012|116.46|39.92|灯泡|1345|S1345|北京南站|1505|1|9012|116.46|39.92|D001035||||TRUE|1|{ef348a64-06eb-e14f-8b4f-d08dc07d2116}|15||扬沙|31

需求如下:

1.找到配属铁路局作为维度
2.统计各个指标
	总数据:监控铁路局数据走向的                                       1    0
	atp总报警数:监控设备报警的正确性     atperror                     1    0
	车载主机:                                          车载主机       1    0
	无线传输单元:                                  无线传输单元       1    0
	应答器信息接收单元报警次数	                   应答器信息接收单元  1    0
	轨道电路信息读取器报警次数	                   轨道电路信息读取器  1    0
	测速测距单元报警次数	                       测速测距单元        1    0
	人机交互接口单元报警次数	                   人机交互接口单元    1    0
	列车接口单元报警次数	                       列车接口单元        1    0
	司法记录单元报警次数                           司法记录单元        1    0
                                                                       
																	   
3.————

哈   List(1   1    1  0   0    0   0   0   0   0   0   0)List(1   1    1  0   0    0   0   0   0   0   0   0)

(k,v).reducebykey((list1,list2)=>list1.zip.list2.map(l1+l2))


4.需求:1.使用sparkcore	去实现这个代码
        2.使用sparksql去实现这个代码(sql语句嵌套判断语句以及自定义udf)
		3.给我输出json(write.json,gson)
		4.输出到mysql(java jdbc,scalikejdbc)

代码如下:
args(0):是原始文件的路径
args(1):是要写入的json文件的路径

import java.util
import java.util.Properties

import bean.BaobiaoSchema
import com.google.gson.Gson
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SaveMode, SparkSession}

import scala.collection.mutable.ListBuffer

object Baobiao {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("bb").setMaster("local[*]")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    import spark.implicits._
    val rdd: RDD[String] = spark.sparkContext.textFile(args(0))
    val rddall: RDD[Array[String]] = rdd.map(_.split("\\|",-1))
    //val rddha: RDD[Array[String]] = rddall.filter(arr => arr(3).contains("哈"))

    val rddlist: RDD[(String, ListBuffer[Int])] = rddall.map(x => {
      val list: ListBuffer[Int] = new ListBuffer[Int]
      list.append(1)
      if (x(17).contains("车载主机") || x(17).contains("无线传输单元")
        || x(17).contains("应答器信息接收单元") || x(17).contains("轨道电路信息读取器")
        || x(17).contains("测速测距单元") || x(17).contains("人机交互接口单元")
        || x(17).contains("列车接口单元") || x(17).contains("司法记录单元")) {
        list.append(1)
      } else {
        list.append(0)
      }

      if (x(17).contains("车载主机")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("无线传输单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("应答器信息接收单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("轨道电路信息读取器")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("测速测距单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("人机交互接口单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("列车接口单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      if (x(17).contains("司法记录单元")) {
        list.append(1)
      } else {
        list.append(0)
      }
      (x(3), list)

    })

    //rddlist.foreach(println(_))
    val rddresult: RDD[(String, ListBuffer[Int])] = rddlist.reduceByKey((x, y)=>x.zip(y).map(k=>k._1 + k._2))
    //rddresult.foreach(println(_))
    val rddrow: RDD[Row] = rddresult.map(x =>
      Row(x._1, x._2(0), x._2(1), x._2(2), x._2(3), x._2(4), x._2(5), x._2(6), x._2(7), x._2(8), x._2(9))
    )
    //rddrow.foreach(println(_))
    val frame: DataFrame = spark.createDataFrame(rddrow,BaobiaoSchema.schema)
    //frame.show()

    //写出json文件方式1
    //可以按照需求:按照列名分区,partitionBy(列名),形成不同的文件
    //可以修改分区数,随机分配,coalesce(分区数量),有几个分区,就会有几个文件
    frame.coalesce(1).write.mode("overwrite").json(args(1))//写入到一个文件中


    //写出json文件,方式2:采用gson,需要一个样例类
    val rddgson: RDD[String] = rddresult.map(x => {
      //创建gson对象
      val gson = new Gson()
      gson.toJson(AttachRWBureauKPI(x._1, x._2(0), x._2(1), x._2(2), x._2(3), x._2(4), x._2(5), x._2(6), x._2(7), x._2(8), x._2(9)))
    })
    //将RDD代表的数据写入文件中,此时的数据已经是json格式了
    rddgson.coalesce(1).saveAsTextFile(args(1))

    spark.stop()
  }
}
case class AttachRWBureauKPI(
                              AttachRWBureau: String,
                              allData: Int,
                              atpError: Int,
                              main: Int,
                              wifi: Int,
                              balise: Int,
                              TCR: Int,
                              speed: Int,
                              DMI: Int,
                              TIU: Int,
                              JRU: Int
                            )

你可能感兴趣的:(大数据)