我们在对报表进行处理的时候,怎么以一个属性为维度,统计其他属性的指标。
以下的案例是我们对我们的报表以配属铁路局为维度统计他们的各个指标,而且要使用多种方法
一个是使用sparkcore去实现,还有一个是使用sparksql来实现
以下的代码是使用sparkcore来实现的
package report
import java.util.Properties
import com.google.gson.Gson
import config.ConfigHelper
import org.apache.commons.lang.StringUtils
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{
DataFrame, SaveMode, SparkSession}
import scalikejdbc.{
DB, SQL}
import scalikejdbc.config.DBs
//根据铁路局维度进行atperror报表统计
object AttachRWBureauAnaylysis {
def main(args: Array[String]): Unit = {
//会有两个参数,一个是输入路径,一个是输出路径,因此参数<2的话说明有参数丢失,报错提醒我们检查
if(args.length<2){
println("参数错误")
return
}
//session
val session = SparkSession
.builder()
//名字
.appName(this.getClass.getName)
//本地的
.master("local[*]")
//配置spark的序列化方式
//spark1.6之前的版本必须得设置
.config("spark.serializer",ConfigHelper.serializer)
.getOrCreate()
//导入隐式转换
import session.implicits._
//读取数据
val sourceFrame: DataFrame = session.read.parquet(args(0))
//处理数据
//row:行
//每一行进行一次处理
val rddResult: RDD[(String, List[Int])] = sourceFrame.map(row => {
//获取铁路局
val attachRWBureau: String = row.getAs[String]("MPacketHead_AttachRWBureau")
//获取atperror
val atpError = row.getAs[String]("MATPBaseInfo_AtpError")
//判断指标
//如果atpError不为空,前面为1,如果atpError为空,那么前面为0
//先判断atpError不为空,如果为空,则执行下面的else语句,全部输出为0
val listAtpError: List[Int] = if (StringUtils.isNotEmpty(atpError)) {
val listError: List[Int] =
if (atpError.equals("车载主机")) {
List[Int](1, 0, 0, 0, 0, 0, 0, 0)
} else if (atpError.equals("无线传输单元")) {
List[Int](0