Spark- 求最受欢迎的TopN课程
数据库操作工具类
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课程的更多相关文章
- 大数据学习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 ...
- 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实现 ...
- 连通图 poj2186 最受欢迎的牛(求最受欢迎的牛的数量)
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27531 Accepted: 11077 De ...
- MapReduce显示最受欢迎的Top10课程(按照课程编号)
上篇博客已经说过,会将代码进行优化,并通过TreeMap进行排序实现,现在简单说明一下代码的思路. 项目以上传到github:https://github.com/yandashan/MapReduc ...
- spark求相同key的最大值
需求: 求相同key的最大值 [("a", 3), ("a", 2), ("a", 5), ("b", 5), ...
- Zeppelie连接jdbc的使用
1. 下载 wget http://apache.mirror.cdnetworks.com/zeppelin/zeppelin-0.8.1/zeppelin-0.8.1-bin-all.tgz 2. ...
- 大数据学习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 ...
- 一些推荐的spark/hadoop课程
为了分享给你们,也为自己. 感谢下面的老师们! 1.王家林DT大数据梦工厂的大数据IMF传奇行动课程 总的目录是: 第一阶段:Linux和Java零基础企业级实战 第二阶段:Hadoop和Hive零基 ...
- [PY3]——求TopN/BtmN 和 排序问题的解决
需求 K长的序列,求TopN K长的序列,求BtmN 排序问题 解决 heap.nlargest().heap.nsmallest( ) sorted( )+切片 max( ).min( ) 总结和比 ...
随机推荐
- Java基础IO流
流 流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.IO流最终要以对象来体现,对象都存在IO包中. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流 ...
- 解析spark RDD
RDD是spark抽象的基石,可以说整个spark编程就是对RDD进行的操作 RDD是弹性的分布式数据集,它是只读的,可分区的,这个数据集的全部或者部分数据可以缓存在内存中,在多次计算间重用.所谓 ...
- nginx的proxy_pass到$host的问题
今天在配置一个location的时候,希望使用一个变量如$host来指示nginx代理: location /test/ { proxy_pass http://$host; } 如你想不到,这个配置 ...
- oracle 累加功能,累加百分比
最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...
- MIC的异步传输
关于signal和wait,属于异步传输的语法,即CPU端无需等待offload语句返回,即可异步运行下面的代码.一般用于启动MIC代码段后,并发执行CPU代码,达到同步执行的目的.另外一种用法是使用 ...
- bootstrap input 加了 disabled 后台竟然接受不到值
下午做了一个input 值需要不可改变.在input属性中加入了 disabled .在后台接受 var_dump($_POST); 竟然看不到值. <input type="t ...
- 功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析(转)
功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析 SimpleCropView是github上第一个第三方开源的图片修剪截取利器,功能强大,设计良好.我个人 ...
- Android Studio导入eclipse工程(引用多个其它工程)
eclipse工程向android studio 迁移过程中需要到编译错误: eclipse工程的结构比较复杂,引用了其它的工程,在迁移的过程中遇到了错误. @ViewInject(R.id.edit ...
- output的使用
如果现在让你做一个滑动的效果 然后在右侧显示滑动停止以后的数值 那么很多人会选择input 和output 来使用 <!DOCTYPE html> <html lang=" ...
- linux系统之间基于密钥对免输入密码登陆
通常,我们登陆到一台linux主机是需要输入密码,这样可以验证登陆者的身份. 这篇随笔里面我打算记录一下配置基于ssh密钥对登陆系统.在配置之前先和大家说明一下我遇到过的问题:刚接触到linux时候首 ...