数据库操作工具类

package com.rz.mobile_tag.utils

import java.sql.{Connection, DriverManager, PreparedStatement}

object MySQLUtils {
/**
* 获取数据库连接
* @return
*/
def getConnection()={
DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?user=root&password=root")
} /**
* 释放数据库连接等资源
* @param conn
* @param pstmt
*/
def release(conn:Connection, pstmt:PreparedStatement)={
try {
if (pstmt !=null){
pstmt.close()
}
}catch {
case e:Exception => e.printStackTrace()
}finally {
if (conn != null){
conn.close()
}
}
}
}

数据操作类:优化点(使用批量插入数据库,提交使用batch操作)

package com.rz.mobile_tag.dao

import java.sql.{Connection, PreparedStatement}

import com.rz.mobile_tag.bean.DayVideoAccessStat
import com.rz.mobile_tag.utils.MySQLUtils import scala.collection.mutable.ListBuffer object StatDao {
/**
* 批量保存DayVideoAccessStat到数据库
* @param list
*/
def insertDayVideoAccessTopN(list: ListBuffer[DayVideoAccessStat]): Unit = {
var connection:Connection = null;
var pstmt:PreparedStatement = null; try {
connection = MySQLUtils.getConnection() connection.setAutoCommit(false) // 设置手动提交 val sql ="insert into day_video_access_topn_stat(day,cms_id,times) value(?,?,?)"
pstmt = connection.prepareStatement(sql) for (ele <- list){
pstmt.setString(1, ele.day)
pstmt.setLong(2,ele.cmsId)
pstmt.setLong(3, ele.times)
pstmt.addBatch()
}
pstmt.executeBatch() // 执行批量处理
connection.commit() // 手工提交
}catch {
case e:Exception =>e.printStackTrace()
}finally {
MySQLUtils.release(connection, pstmt)
}
}
}

业务实现类

package com.rz.mobile_tag.log

import com.rz.mobile_tag.bean.DayVideoAccessStat
import com.rz.mobile_tag.dao.StatDao
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import org.apache.spark.sql.functions._ import scala.collection.mutable.ListBuffer object TopNStatJob { def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName(s"${this.getClass.getSimpleName}")
.config("spark.sql.sources.partitionColumnTypeInference.enabled","false")
.master("local[2]")
.getOrCreate() val accessDF: DataFrame = spark.read.format("parquet").load(args(0))
accessDF.printSchema()
accessDF.show(false) // 最受欢迎的TopN课程
videoAccessTopNStat(spark, accessDF) spark.stop()
} /**
* 最受欢迎的TopN课程
* @param spark
* @param accessDF
*/
def videoAccessTopNStat(spark: SparkSession, accessDF: DataFrame) = {
// import spark.implicits._
// val videoAccesssTopNDF: Dataset[Row] = accessDF.filter($"day" === "20190506" && $"cmsType" === "video")
// .groupBy("day", "cmsId")
// .agg(count("cmsId")).as("times").orderBy($"times".desc)
// videoAccesssTopNDF.show(false) accessDF.createOrReplaceTempView("access_logs") // 使用SQL方式进行统计
val videoAccesssTopNDF: DataFrame = spark.sql("select day, cmsId, count(1) as times from access_logs" +
" where day = '20190506' and cmsType = 'video' group by day, cmsId" +
" order by times desc") //videoAccesssTopNDF.show(false) // 将统计数据写入到MySQL中
try{
videoAccesssTopNDF.foreachPartition(partitionOfRecords=>{
val list = new ListBuffer[DayVideoAccessStat]
partitionOfRecords.foreach(info =>{
val day = info.getAs[String]("day")
val cmsId = info.getAs[Long]("cmsId")
val times = info.getAs[Long]("times") list.append(DayVideoAccessStat(day, cmsId, times))
})
StatDao.insertDayVideoAccessTopN(list)
})
}catch {
case e:Exception => e.printStackTrace()
}
}
}

Spark- 求最受欢迎的TopN课程的更多相关文章

  1. 大数据学习day21-----spark04------1. 广播变量 2. RDD中的cache 3.RDD的checkpoint方法 4. 计算学科最受欢迎老师TopN

    1. 广播变量  1.1 补充知识(来源:https://blog.csdn.net/huashetianzu/article/details/7821674) 之所以存在reduce side jo ...

  2. Spark:求出分组内的TopN

    制作测试数据源: c1 85 c2 77 c3 88 c1 22 c1 66 c3 95 c3 54 c2 91 c2 66 c1 54 c1 65 c2 41 c4 65 spark scala实现 ...

  3. 连通图 poj2186 最受欢迎的牛(求最受欢迎的牛的数量)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27531   Accepted: 11077 De ...

  4. MapReduce显示最受欢迎的Top10课程(按照课程编号)

    上篇博客已经说过,会将代码进行优化,并通过TreeMap进行排序实现,现在简单说明一下代码的思路. 项目以上传到github:https://github.com/yandashan/MapReduc ...

  5. spark求相同key的最大值

    需求: 求相同key的最大值  [("a", 3),  ("a", 2),  ("a", 5),  ("b", 5),  ...

  6. Zeppelie连接jdbc的使用

    1. 下载 wget http://apache.mirror.cdnetworks.com/zeppelin/zeppelin-0.8.1/zeppelin-0.8.1-bin-all.tgz 2. ...

  7. 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF

    1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...

  8. 一些推荐的spark/hadoop课程

    为了分享给你们,也为自己. 感谢下面的老师们! 1.王家林DT大数据梦工厂的大数据IMF传奇行动课程 总的目录是: 第一阶段:Linux和Java零基础企业级实战 第二阶段:Hadoop和Hive零基 ...

  9. [PY3]——求TopN/BtmN 和 排序问题的解决

    需求 K长的序列,求TopN K长的序列,求BtmN 排序问题 解决 heap.nlargest().heap.nsmallest( ) sorted( )+切片 max( ).min( ) 总结和比 ...

随机推荐

  1. iOS ZipArchive文件解压缩

    ZipArchive可以用于iOS中文件的解压缩 压缩文件的方法: //将工程中picture添加到左面111.zip压缩文件中 如果崩溃请更换压缩路径 -(void)testZipFile{ //压 ...

  2. [译]GLUT教程 - 弹出菜单基础

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Popup Menus 弹出菜单也是GLUT的一部分.虽然 ...

  3. Win7 设置、访问共享文件夹

    一.设置共享文件夹 右键点击文件夹,打开“属性”窗口,选择“共享”选项卡 点击“共享”按钮,打开“文件共享”窗口,在下拉列表中选择账户,点“添加”,最后点“共享”按钮. 二.访问 \\192.168. ...

  4. Spring在注入bean异常时的替换

    情形:需要把数据库1的连接池A注入到DAO中,但是如果数据库A的连接池实例化失败了整个项目也启动不了,这个时候希望用数据库2的连接池来替换. 这里没有想到什么好的解决方法,只是想到了工厂方法提供Bea ...

  5. 配置LANMP环境(8)-- 安装Samba与配置

    Samba套件,将linux下的文件夹共享给windows(本地开发会很方便) 一.安装Samba yum install –y samba 二.配置Samba 1.备份配置文件 cp /etc/sa ...

  6. FreeSWITCH 基础

    [1]FreeSWITCH 是什么? FreeSWITCH是一个开源的电话交换平台. 世界上第一个跨平台的.伸缩性极好的.免费的.多协议的电话软交换平台. 从技术上讲,FreeSWITCH是一个B2B ...

  7. Latex中參考文献排序

    \bibliographystyle{unsrt}:依照引用的先后排序 \bibliographystyle{plain}:按字母的顺序排列,比較次序为作者.年度和标题.当中作者中姓氏字母优先. 关于 ...

  8. swift 使用运行时进行属性关联

    1.用OC思想写swift代码真得很爽,swift需要的OC基本上都有,只不过略微改变了一下,例如以前的Foundation库前缀NS全部去掉了,等等...思想其实都一样,不过swift确实非常精简, ...

  9. 虚拟机 minimal 安装增强包

    在虚拟机下安装了一个centos的minimal镜像,发现增强包不能安装,鼠标不能在虚拟机和物理机间自由切换.不能共享粘贴板,非常是不爽,这里摸索出在centos  minimal OS下安装增强包的 ...

  10. linux c编程:popen

    我们在执行shell命令比如cat /etc/group | grep root的时候,通过管道的机制将cat /etc/group的结果传递给grep root,然后将结果显示出来 linux中提供 ...