在学习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
)