利用sparksql进行报表分析

大数据分析工程师面试20题 ◀ SQL/SparkSql/HiveQL 大数据分析工程师80%的时间都在与SQL打交道,通过SQL完成业务方的各种临时性需求分析和常规性报表统计。熟练的SQL技能能够大大提高工作效率。本文将SQL/SparkSql/HiveQL放在一起来梳理一份常见题型的面试题库。 01 SQL基础知识考察 对于面试初级数据分析师来说,SQL的面试重点会放在基础知识的考察,如果最基本的基础概念和语法都不能熟练回答出来的话,通过面试的几率就... 阅读详情
package report

import config.ConfigHelper
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SparkSession}
import utils.MakeATPKpi

//利用sparksql进行报表分析
object TrainTimeSparkSQLAnalysis {
  def main(args: Array[String]): Unit = {
    //session
    val session = SparkSession
      .builder()
      //设置是否是在本地运行
      //*代表几个线程
      .master("local[*]")
      //设置进程的名称
      .appName(this.getClass.getName)
      //序列化
      .config("spark.serializer", ConfigHelper.serializer)
      .getOrCreate()
    //导入隐式转换
    import session.implicits._
    //读取原始日志
    val frame = session.read.parquet(args(0))
    //读取列车出厂时间的数据
    val trainTimeSource: RDD[String] = session.sparkContext.textFile(args(1))
    //切分并且数据清洗
    val filted = trainTimeSource.map(_.split("\\|",-1)).filter(_.length>=2)
    val trainTimeDF: DataFrame = filted.map(arr=>(arr(0),arr(1))).toDF("trainId","trainTime")
    //注册表
    //临时表
    frame.createTempView("logs")
    //创建临时视图
    trainTimeDF.createTempView("trainTime")
    //注册udf
    session.udf.register("myif",(boolean:Boolean)=>if (boolean) 1 else 0)
    //写sql语句
    //GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组。
    //GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等。
    session.sql(
      "select a.trainTime,sum(c.cnt),sum(c.atpError),sum(c.main),sum(c.wifi),sum(c.balise),sum(c.TCR),sum(c.speed),sum(c.DMI),sum(c.TIU),sum(c.JRU) from trainTime a join (select MPacketHead_TrainID,count(*) as cnt,"+MakeATPKpi.sqlStr+
        " from logs group by MPacketHead_TrainID) c on a.trainId=c.MPacketHead_TrainID group by a.trainTime").show()
    //释放资源
    session.stop()
  }

}

工具类
MakeATPKpi.scala:

package utils

import org.apache.commons.lang.StringUtils
import org.apache.spark.sql.Row

object MakeATPKpi {
  def makeKpi(row:Row)={
    //获取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, 1, 0, 0, 0, 0, 0, 0)
        } else if (atpError.equals("应答器信息接收单元")) {
          List[Int](0, 0, 1, 0, 0, 0, 0, 0)
        } else if (atpError.equals("轨道电路信息读取器")) {
          List[Int](0, 0, 0, 1, 0, 0, 0, 0)
        } else if (atpError.equals("测速测距单元")) {
          List[Int](0, 0, 0, 0, 1, 0, 0, 0)
        } else if (atpError.equals("人机交互接口单元")) {
          List[Int](0, 0, 0, 0, 0, 1, 0, 0)
        } else if (atpError.equals("列车接口单元")) {
          List[Int](0, 0, 0, 0, 0, 0, 1, 0)
        } else if (atpError.equals("司法记录单元")) {
          List[Int](0, 0, 0, 0, 0, 0, 0, 1)
        } else {
          //这是为了防止获取的atpError的值都不符合上述判断条件的情况
          List[Int](0, 0, 0, 0, 0, 0, 0, 0)
        }
      //两个list的拼接要用++
      List[Int](1) ++ listError
    } else {
      //如果atpError为空的情况,说明这行的这个属性没有值,那么全取为0即可
      List[Int](0, 0, 0, 0, 0, 0, 0, 0, 0)
    }
    //创建一个容器用来存放标签
    //两个list的拼接要用++
    //这个是为了在整合以后统计总共多少条数据用,相当于数量
    val list: List[Int] = List[Int](1) ++ listAtpError
    list
  }

  //sql字符串
  val sqlStr="sum(if(MATPBaseInfo_AtpError != '',1,0)) as atpError,sum(case when MATPBaseInfo_AtpError = '车载主机' then 1 else 0 end) as main,"+
    "sum (myif(MATPBaseInfo_AtpError = '无线传输单元') ) as wifi,"+
    "sum (myif(MATPBaseInfo_AtpError = '应答器信息接收单元') ) as balise,"+
    "sum (myif(MATPBaseInfo_AtpError = '轨道电路信息读取器') ) as TCR,"+
    "sum (myif(MATPBaseInfo_AtpError = '测速测距单元') ) as speed,"+
    "sum (myif(MATPBaseInfo_AtpError = '人机交互接口单元') ) as DMI,"+
    "sum (myif(MATPBaseInfo_AtpError = '列车接口单元') ) as TIU,"+
    "sum (myif(MATPBaseInfo_AtpError = '司法记录单元') ) as JRU"
}

配置文件
application.conf:

#配置文件
#配置压缩格式
parquet.code="snappy"
#配置序列化方式
spark.serializer="org.apache.spark.serializer.KryoSerializer"
#配置jdbc链接
jdbc.url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"
jdbc.driver="com.mysql.jdbc.Driver"
jdbc.user="root"
jdbc.password="000000"
#配置scalikejdbc链接
db.default.url="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"
db.default.driver="com.mysql.jdbc.Driver"
db.default.user="root"
db.default.password="000000"

ConfigHelper.scala:

package config

import com.typesafe.config.{Config, ConfigFactory}

object ConfigHelper {
  //加载配置文件
  private lazy val load: Config = ConfigFactory.load()
  //加载压缩格式
  val parquetCode: String = load.getString("parquet.code")
  //加载序列化方式
  val serializer: String = load.getString("spark.serializer")
  //加载jdbc
  val url: String = load.getString("jdbc.url")
  val driver: String = load.getString("jdbc.driver")
  val user: String = load.getString("jdbc.user")
  val password: String = load.getString("jdbc.password")
  //加载scalikejdbc
  val url2: String = load.getString("db.default.url")
  val driver2: String = load.getString("db.default.driver")
  val user2: String = load.getString("db.default.user")
  val password2: String = load.getString("db.default.password")

}
大数据Spark(二十六):SparkSQL数据处理分析 两种方式底层转换为RDD操作,包括性能优化完全一致,在实际项目中语句不通的习惯及业务灵活选择。无论哪种方式,都是相通的,必须灵活使用掌握。上述函数在实际项目中经常使用,尤其数据分析处理的时候,其中要注意,调用函数时,通常指定某个列名称,传递Column对象,通过。,将DataFrame/Dataset注册为临时视图或表,编写SQL语句,类似HiveQL;,调用DataFrame/Dataset API(函数),类似RDD中函数;调用DataFrame/Dataset中API(函数)分析数据,其中函数包含。 阅读详情

相关推荐

SparkSQL系列-4、数据处理分析

SparkSQL系列-4、数据处理分析

不积跬步无以至千里,不积小流无以成江河 1547

【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析

后面将报表结果数据保存MySQL表中时,采用的是自己编写代码,并不使用DataFrame自带format(“jdbc”)方式,不能满足需求:当某日报表统计程序运行多次时,插入数据到结果表中,采用Append最佳方式,主键冲突;采用OverWrite方式,将会将表删除,以前统计结果也都删除。编写【RegionStateReport.scala】类,创建【doReport】方法,接收DataFrame为参数,进行报表统计,并最终保存至MySQL表中,封装保存结果数据代码至saveToMySQL方法中。

优快云GuoYuying的博客 728

spark 统计图表【在已有集群环境下】操作

我这是在已有的集群环境下,做的一个简单统计查询,图标显示,简单介绍了hdfs的作用,还有spark的rdd操作,使用vaadin框架,highchart插件显示图表

掌握Spark的数据分析和报表生成

1.背景介绍 在大数据时代,数据分析和报表生成是非常重要的。Apache Spark是一个快速、高效的大数据处理框架,它可以处理批量数据和流式数据,并提供了一系列的数据分析和报表生成功能。本文将介绍Spark的数据分析和报表生成的核心概念、算法原理、最佳实践、应用场景和工具推荐。 1. 背景介绍 Spark是一个开源的大数据处理框架,它可以处理批量数据和流式数据,并提供了一系列的数据分析和报...

AI天才研究院 906

Vivado 2021.1 实战:手把手教你用IEEE1735 V2加密你的Verilog源码(附完整TCL命令)

本文详细介绍了在Vivado 2021.1中使用IEEE1735 V2标准加密Verilog源码的全流程,包括许可证申请、密钥文件配置、TCL命令执行及加密后验证。通过实战步骤和完整TCL命令,帮助开发者有效保护FPGA设计知识产权,确保核心算法安全。

weixin_42706667的博客 191

稳定性性能系列之五——Native Crash深度分析:工具实战

深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因

Cheson的专栏 1548

学习Spark的数据可视化和报表

1.背景介绍 在大数据时代,数据可视化和报表彻底成为了企业和组织中不可或缺的工具。Apache Spark作为一个快速、高效的大数据处理框架,在数据处理和分析方面发挥了巨大作用。本文将从以下几个方面进行深入探讨: 1. 背景介绍 数据可视化和报表是数据分析的重要组成部分,可以帮助我们更好地理解和挖掘数据中的信息。Spark提供了丰富的数据可视化和报表功能,可以帮助我们更快更好地进行数据分析和...

AI天才研究院 1345

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

Spark教程——(7)编写spark-sql程序读取HBase定时生成报表

plugin划红线报错: maven-scala-plugin maven-shade-plugin 查找Maven仓库,发现一个没有jar包,一个jar包无法解压缩打开,删除Maven中坏的jar包,并Reimport成功,IDEA不再报错: 在IDEA的Maven面板中,设置跳过test,为打包做准备: 打包Spark程序: 打包程序报错:...

weixin_30765475的博客 536

40岁从智驾转具身智能之路

我的工作经历比较复杂,本科毕业后工作2年再次读研的,本科和硕士都是机械专业,硕士毕业后干了5年CAM和机器人再转入到自动驾驶行业。在自动驾驶干了8年,发现自动驾驶已经到了一个瓶颈,再次转行做具身智能。我就谈谈自己的最近这次转型之路。

hzm8341的博客 638

【Altium designer】BOM导出 Bill of Materials 如何自定义格式

【Altium designer】如何自定义BOM导出格式 我们用Excel做一个xx.xlt的2003的模版文件,取文件名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt文件存放在:AltiumDesiger 安装目录的Template文件夹内

夜半少年的博客 2717

SQL优化——成本计算

全表扫描成本计算、索引范围扫描成本计算、SQL优化核心思想

码说芯语的博客 1542

Nvidia Jetson平台 JP4.2.1版本GStreamer视频采集异常问题调试记录

Nvidia Jetson平台GStreamer in JP4.2.1不能采集但是 v4l2-ctl和 ffmpeg能正常采集视频。

jzwjzw19900922的博客 2127

经验 // 用python自动生成word报告或excel报表

在和业务或领导多次交流后,报告或报表的模板比较固定了,这时候可以用python自动生成,提升质效。

cqx2020的博客 1381

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 890

深度解析长鑫G5 DRAM工艺的技术逻辑与微缩边界

长鑫存储G5 DRAM平台通过多重图形化、45:1高深宽比电容与外围HKMG技术,突破先进光刻受限瓶颈,在11.95 nm有源区半间距下实现阵列微缩与电容结构优化。其核心意义不在于对标国际节点,而在于系统性解决“尺寸缩小—电荷保持—外围跟进而”三大矛盾,展现国产DRAM在无EUV条件下推进先进制程的工艺整合能力。

硬核科技 36

【SQL】COUNT... FILTER 的适用场景

COUNT(*) FILTER (WHERE …) 通过语法精简与执行优化,显著提升了条件统计的效率与可维护性。尤其在 PostgreSQL 和 Spark 生态中,是多维分析的推荐实践,对于需兼容传统数据库的场景,可通过 CASE WHEN 平稳过渡即可。

用最通俗的语言,讲述对技术的理解。 1637

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SparkSQL的应用:数据报表

1.背景介绍 1. 背景介绍 Apache Spark是一个开源的大规模数据处理框架,它可以处理批量数据和流式数据。SparkSQL是Spark框架的一个组件,它提供了一个用于处理结构化数据的SQL查询引擎。SparkSQL可以处理各种结构化数据,如HDFS、Hive、Parquet等。 数据报表是一种用于展示数据的方式,它可以帮助用户更好地理解和分析数据。在现代企业中,数据报表是一种常见的...

AI天才研究院 947

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

sparksql和spark core 实现地域报表分析

文章目录计算逻辑spark sql实现代码spark core实现代码读取的普通日志文件读取parquet文件 计算逻辑 spark sql实现代码 package com.dmp.report import org.apache.spark.sql.{DataFrame, SQLContext} import org.apache.spark.{SparkConf, SparkContex...

张不帅 1226

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

实战:利用Spark SQL进行报表和数据分析

1.背景介绍 Spark SQL是Apache Spark项目中的一个组件,它提供了一个用于处理大规模数据的SQL查询引擎。Spark SQL可以处理结构化数据,例如CSV文件、JSON文件、Parquet文件等,以及非结构化数据,例如日志文件、数据流等。Spark SQL可以与Spark Streaming、MLlib、GraphX等其他组件集成,以实现端到端的大数据分析和机器学习任务。 在...

AI天才研究院 1011

实战:利用Spark SQL进行数据报表和分析

1.背景介绍 Spark SQL是Apache Spark的一个组件,它提供了一个用于处理结构化数据的API。Spark SQL可以处理各种数据源,如HDFS、Hive、Parquet等,并提供了一种类SQL的查询语言。在大数据领域,Spark SQL是一个非常重要的工具,它可以帮助我们快速地进行数据报表和分析。 在本文中,我们将深入探讨Spark SQL的核心概念、核心算法原理、具体操作步骤...

AI天才研究院 1452

presto、druid、sparkSQL、kylin的对比分析

这几个框架都是OLAP大数据分析比较常见的框架,各自特点如下: presto:facebook开源的一个java写的分布式数据查询框架,原生集成了Hive、Hbase和关系型数据库,Presto背后所使用的执行模式与Hive有根本的不同,它没有使用MapReduce,大部分场景下比hive快一个数量级,其中的关键是所有的处理都在内存中完成。 Druid:是一个实时处理时序数据的Olap数据库,...

进行中 1718

presto,druid,sparkSQL,kylin的对比分析

1.这几个框架都是OLAP大数据分析比较常见的框架,各自特点如下:     • presto:facebook开源的一个java写的分布式数据查询框架,原生集成了Hive、Hbase和关系型数据库,Presto背后所使用的执行模式与Hive有根本的不同,它没有使用MapReduce,大部分场景下比hive快一个数量级,其中的关键是所有的处理都在内存中完成。                    ...

程序员学习圈 1375

实战:利用Spark SQL进行数据报表和预测

1.背景介绍 Spark SQL是Apache Spark生态系统中的一个重要组件,它提供了一种类SQL的查询语言,可以方便地处理大规模的结构化数据。Spark SQL可以与Spark Streaming、MLlib、GraphX等其他组件结合使用,实现端到端的大数据处理和分析。 在本文中,我们将深入探讨如何利用Spark SQL进行数据报表和预测。首先,我们将介绍Spark SQL的核心概念...

AI天才研究院 1341

开源OLAP引擎测评报告(SparkSql、Presto、Impala、HAWQ、ClickHouse、GreenPlum)

本文为博主公司原创文章,仿冒必究,转载请回复留言 开源OLAP引擎测评报告(SparkSql、Presto、Impala、HAWQ、ClickHouse、GreenPlum) 易观CTO 郭炜 序 现在大数据组件非常多,众说不一,在每个企业不同的使用场景里究竟应该使用哪个引擎呢?这是易观Spark实战营出品的开源Olap引擎测评报告,团队选取了Hive、Sparksql、Presto、Impala...

数据之路 3万+
上一篇: 利用mysql存储数据进行报表分析
下一篇: 怎么保证Kafka的数据不乱序
NewBee.Mu
博客等级 码龄8年 602粉丝 379原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值