scala实现通过Spark统计人均登录次数最终写入MySQL

谨以此博客作为记录
小编这里用的版本是:
<hadoop.version>2.7.7</hadoop.version>
<spark.version>2.4.5</spark.version>
<scala.version>2.12.10</scala.version>
如果没用到Hadoop可以忽略

步骤

  1. 准备数据,知道每个文件什么内容,每一列什么意思
    我这里对应文件夹下,是按日期作为文件名存储的txt文件数据
    在这里插入图片描述
  2. 数据可放在本地,也可放在HDFS上,数据在本地代码完全是可以跑通的;但是小编想模拟数据存在集群(HDFS)上的情况,条件有限,DataNode总是dead,搞得小编也很sad(押上了hhh)
  3. 编写代码
  • ①首先创建SparkContext和SparkSession对象;
  • ②引入implicit隐式转换包,方便后面将RDD转换为DataFrame;
  • ③创建数据库连接,方便后面将结果写入数据库;
  • ④从文件名中截取日期并写入文件,后面分析数据需要;
  • ⑤利用RDD的算子将数据进行拆分、切割、整理,并转换为DataFrame;
  • ⑥创建临时表,便于用SQL语句对表进行查询;
  • ⑦将查询结果写入数据库;

代码

import org.apache.spark.sql.{SparkSession}
import org.apache.spark.{SparkConf, SparkContext}

object readData {
  def main(args: Array[String]): Unit = {
  	//SparkConf是用来配置Spark应用程序的参数的类。在这个代码中,
  	//setAppName("ReadData")设置了应用程序的名称为"ReadData",
  	//而setMaster("local[*]")指定了Spark应用程序的运行模式为本地模式,使用所有可用的CPU核心
    val conf = new SparkConf().setAppName("ReadData").setMaster("local[*]")
    //初始化一个SparkContext对象。SparkContext是与Spark集群通信的主要入口点
    val sc = new SparkContext(conf)
    //创建了一个SparkSession对象,它是Spark 2.0引入的API,提供了一种统一的入口点来访问Spark功能
    val spark = SparkSession.builder().getOrCreate()
    import spark.implicits._
    //创建数据库连接
    var prop=new java.util.Properties()
    prop.put("user","root") //MySQL用户名
    prop.put("password","123456")  //MySQL密码
    prop.put("driver","com.mysql.jdbc.Driver")  //MySQL驱动
    val url="jdbc:mysql://localhost:3306/login"  MySQL URL,端口号后面是数据库名(login)
    //如果数据在HDFS集群上,就可以将路径替换为HDFS集群上的路径
    //val hdfsPath = "hdfs://IP:9000/data/0007/CharacterLogin";
    //路径
    val path="\\2015-6-12\\0001\\0007\\CharacterLogin"
    
    //wholeTextFiles: 是SparkContext对象的一个方法,用于读取整个文本文件
    //返回的RDD: 其中键是文件路径,值是文件内容。
    val rdd1 = sc.wholeTextFiles(path)
//    打印文件路径进行调试
//    rdd1.foreach { t =>
//      val filePath = t._1
//      println("File Path: " + filePath)
//    }
	//从文件名中截取日期并写入文件
    //rdd2返回的是alllines拼接之后的数据
    val rdd2 = rdd1.flatMap(t=>{
      val filePath = t._1
      val alllines = t._2
      //使用了 substring 方法来截取文件路径中从最后一个 / 符号(包括)之后到 .txt 扩展名(不包括)之前的部分
      val dateStr=filePath.substring(filePath.lastIndexOf("/")+1, filePath.lastIndexOf(".txt"))
      alllines.split("\r\n").map(line=>dateStr+"|"+line)
    })

    //对数据进行拆分,提取相关信息
    // 这里主要统计人均登陆次数(DEC)==总的登录次数除以用户数
    // LoginStatus==0表示登录
    val res = rdd2.map(line => line.split('|')).map(arr => (arr(6), arr(11),arr(0))).toDF("userID", "LoginStatus","loginDate").filter("LoginStatus==0")
    //临时表创建
    res.createTempView("LoginCount")
    //查询
    val res1=spark.sql("select loginDate,count(LoginStatus)/count(distinct userID) as loginNum from LoginCount where LoginStatus=0 group by loginDate").sort("loginDate")
    //写入mysql数据库
    res1.write.mode("append").jdbc(url,"logincount",prop)
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/517447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Latex】参考文献标号未对齐解决方案

Latex写论文时发现最后参考文献标号出现如下没有对齐的情况&#xff1a; 解决方案&#xff1a; 将参考文献开始出的序号1改为99&#xff08;或者其他大点的数字也可以&#xff09; ⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

JSON的定义和基本使用

1、JSON的特点: JSON是一种轻量级的数据交换格式&#xff0c;是由字符串化的键值对构成。基于网络的前后端通信&#xff0c;数据在服务端和客户端之间进行传输&#xff0c;采用的就是JSON的格式来进行交互。JSON采用完全独立于语言的文本格式&#xff0c;JSON的数据格式完全独…

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …

【测试篇】测试用例

文章目录 前言具体设计测试用例等价类边界值场景设计法判定表&#xff08;因果图&#xff09;正交排列&#xff08;用的非常少&#xff09;错误猜测法 前言 什么是测试用例&#xff1f;&#xff1f; 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤&#xf…

了解 Solidity 语言:构建智能合约的首选编程语言

了解 Solidity 语言&#xff1a;构建智能合约的首选编程语言 Solidity 是一种用于编写智能合约的高级编程语言&#xff0c;广泛应用于以太坊和其他以太坊虚拟机&#xff08;EVM&#xff09;兼容的区块链平台。它是以太坊智能合约的首选语言之一&#xff0c;具有丰富的功能和灵活…

GEE教程——如何利用影像行列号和distinct函数实现影像的筛选

如何利用影像行列号和distinct函数实现影像的筛选 本次主要利用Landsat中 WRS_PATH 和 WRS_ROW属性实现对影像的筛选。这里我们会用到遍历函数map也就是我们需要对其影像中的每一景影像的行列号属性进行获取,然后再对其列表化,然后利用distinct函数实现属性分离,最后移除不…

Coursera上托福专项课程01:TOEFL Reading and Listening Sections Skills Mastery 学习笔记

TOEFL Reading and Listening Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-reading-listening-sections-skills-mastery 这门课的笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 TOEFL Reading and Listening …

【系统架构师】-软件产品线与构件

1、产品线 核心资源、产品集合 1、过程驱动 2、特定领域 3、技术支持 4、以架构为中心 双生命周期模型&#xff1a; 建立产品线的方式&#xff1a;演化、革命 成功因素&#xff1a; 对该领域具备长期和深厚的经验 一个用于构建产品的好的核心资源库 好的产品线架构 好的管…

STM32CubeMX 中配置__weak类型函数和用法

目录 概述 1 weak类型函数 1.1 weak类型函数介绍 1.2 weak类型函数的特点 2 在 STM32CubeMX中配置weak类型函数 2.1 配置函数类型 2.2 生成代码 2.3 验证 3 _weak类型函数项目中的应用 3.1 重写_weak类型函数 3.2 测试 4 总结 概述 本文主要介绍__weak类型函数…

java算法day44 | 动态规划part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包&#xff0c;完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

接口调用成功后端却一直返回404

vuespringboot 我在vue.config.js中配置了向后端的反向代理 然后使用了axios向后端发送post请求 可以看到可以接收到前端传来的值 但是前端控制台却报了 “xhr.js:245POST http://localhost:7777/api/login 404 (Not Found)” 最后询问我那智慧的堂哥... ... 解决办法是把C…

Flutter Boost 3

社区的 issue 没有收敛的趋势。 设计过于复杂&#xff0c;概念太多。这让一个新手看 FlutterBoost 的代码很吃力。 这些问题促使我们重新梳理设计&#xff0c;为了彻底解决这些顽固的问题&#xff0c;我们做一次大升级&#xff0c;我们把这次升级命名为 FlutterBoost 3.0&am…

IMAP的要点:旅行前需要了解的内容

你是否经常因会议而出差&#xff0c;需要在各种设备上灵活地访问你的电子邮件&#xff1f;如果是的话&#xff0c;你可能会想了解你的电子邮件系统是如何通过使用互联网消息访问协议&#xff08;IMAP&#xff09;来工作的&#xff0c;这样当你不在办公桌前时&#xff0c;你可以…

1.Docker简介和安装

1 Docker 简介 1.1 Docker 是什么&#xff1f; docker是一个开源的应用容器引擎。 1.2 容器是什么&#xff1f; 容器是一种轻量级的虚拟化技术 &#xff0c;它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例&#xff0c;如下图所示&#xff1a;Ngin…

Revit 2025新功能一览~

Hello大家好&#xff01;我是九哥~ Revit2025已经更新&#xff0c;安装后&#xff0c;简单试了下&#xff0c;还是挺不错的&#xff0c;流畅度啊&#xff0c;新功能啊&#xff0c;看来还是有听取用户意见的&#xff0c;接下来就简单看看都有哪些新功能。 好了&#xff0c;今天的…

大转盘抽奖小程序源码

源码介绍 大转盘抽奖小程序源码&#xff0c;测试依旧可用&#xff0c;无BUG&#xff0c;跑马灯旋转效果&#xff0c;非常酷炫。 小程序核心代码参考 //index.js //获取应用实例 var app getApp() Page({data: {circleList: [],//圆点数组awardList: [],//奖品数组colorCirc…

CVPR24_ArGue: Attribute-Guided Prompt Tuning for Vision-Language Models

Abstract 尽管软提示微调在调整视觉语言模型以适应下游任务方面表现出色&#xff0c;但在处理分布偏移方面存在局限性&#xff0c;通过属性引导提示微调&#xff08;Attribute-Guided&#xff0c;ArGue&#xff09;来解决这个问题 Contributions 与直接在类名之前添加软提示…

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react&#xff0c;vuejs&#xff0c;angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建&#xff0c;比如 ant-design 是基于 react 搭建的UI组件库&#xff0c;而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…

.net框架和c#程序设计第二次测试

一、实验内容 1、设计一个用户登录页面webform1.aspx&#xff0c;效果如下图所示&#xff1a; 2、点击webform1.aspx中“还未注册”连接进入register.aspx&#xff0c;注册页面效果如下图所示&#xff1a;点击用户注册信息到usershow.aspx页面&#xff0c;并显示注册的用户信息…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点&#xff0c;随着5G技术越来越普及&#xff0c;汽车智能化发展将越来越迅速。从传统汽车到智能汽车&#xff0c;不是简单功能的增强&#xff0c;而是从单一功能的交通工具变成可移动的办公和娱乐空间&#xff0c;成为物联…