import java.text.SimpleDateFormat
import java.util.Properties
import org.apache.spark.sql.SparkSession
import scala.collection.mutable.ArrayBuffer
object MultiplePartitionsMysql {
var spark = SparkSession
.builder()
.appName(this.getClass.getSimpleName.filter(!_.equals("$")))
//.enableHiveSupport()
.master("local[*]")
.config("hive.exec.dynamic.partition", "true")
.config("hive.exec.dynamic.partition.mode", "nonstrict")
.config("hive.exec.max.dynamic.partitions", "10000")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.getOrCreate()
val youqun = new Properties()
youqun.put("user", "root")
youqun.put("password", "123456")
youqun.put("driver", "com.mysql.jdbc.Driver")
youqun.put("url", "jdbc:mysql://localhost:3306/wang?characterEncoding=utf8&useSSL=false")
val partitions = 3
def main(args: Array[String]): Unit = {
spark.sparkContext.setLogLevel("ERROR")
val resultframe = readTables(youqun.getProperty("url"), "csv", youqun, 3, "load_date", "date").cache()
//val resultframe = readTables(youqun.getProperty("url"), "csv", youqun, 4, "sequence", "long")
//resultframe.show(10, false)
println(resultframe.count())
println(resultframe.rdd.getNumPartitions)
resultframe.rdd.glom().foreach(part => println(part.getClass.getName + "=======" + part.length))
}
/**
* @param url 指定url
* @param table 指定表名
* @param properties 连接rds设置参数
* @param partitions 自定义分区个数
* @param column 指定多分区划分字段
* @param columntype 多分区划分字段类型
* @return
*/
def readTables(url: String, table: String, properties: Properties, partitions: Int, column: String, columntype: String) = {
var dataFrame = spark.emptyDataFrame
//根据 指定分区字段类型判断 多分区读取数据方式
if (columntype.toLowerCase() == "long") {
val array = getMaxMin(table, properties, column)
val minNum = array(0).toLong
val maxNum = array(1).toLong
dataFrame = spark.read.jdbc(url, table, column, minNum, maxNum, partitions, properties)
//如果分区字段是时间格式,根据字段划分分区区间
} else if (columntype.toLowerCase() == "date") {
val array = getMaxMin(table, properties, column)
val arraypartition = generateArray(array, partitions, column)
dataFrame = spark.read.jdbc(url, table, arraypartition, properties)
}
dataFrame
}
def getMaxMin(table: String, properties: Properties, column: String) = {
val arrays = ArrayBuffer[String]()
val array = spark.read.jdbc(youqun.getProperty("url"), table, youqun).selectExpr(s"min(${column}) as minNum", s"max(${column}) as maxNum").collect()
if (array.length == 1) {
arrays.append((array(0)(0).toString))
arrays.append((array(0)(1).toString))
}
arrays.toArray
}
//根据最小最大值时间范围,按照指定分区个数切分成时间分区
def generateArray(minmaxNum: Array[String], partition: Int, colum: String): Array[String] = {
val array = ArrayBuffer[(String, String)]()
var resultArray = Array[String]()
//根据常见的时间格式进行调整
if (minmaxNum(0).contains("-")) {
val dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
var minTime = dateFormat.parse(minmaxNum(0)).getTime()
val maxTime = dateFormat.parse(minmaxNum(1)).getTime()
val subNum = (maxTime - minTime) / partition.toLong
var midNum = minTime
for (i <- 0 to partition - 1) {
minTime = midNum
midNum = midNum + subNum
if (i == partition - 1) {
array.append(dateFormat.format(minTime) -> dateFormat.format(maxTime))
} else {
array.append(dateFormat.format(minTime) -> dateFormat.format(midNum))
}
}
} else if (minmaxNum(0).contains("/")) {
val dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
var minTime = dateFormat.parse(minmaxNum(0)).getTime()
val maxTime = dateFormat.parse(minmaxNum(1)).getTime()
val subNum = (maxTime - minTime) / partition.toLong
var midNum = minTime
for (i <- 0 to partition - 1) {
minTime = midNum
midNum = midNum + subNum
if (i == partition - 1) {
array.append(dateFormat.format(minTime) -> dateFormat.format(maxTime))
} else {
array.append(dateFormat.format(minTime) -> dateFormat.format(midNum))
}
}
} else {
val dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss")
var minTime = dateFormat.parse(minmaxNum(0)).getTime()
val maxTime = dateFormat.parse(minmaxNum(1)).getTime()
val subNum = (maxTime - minTime) / partition.toLong
var midNum = minTime
for (i <- 0 to partition - 1) {
minTime = midNum
midNum = midNum + subNum
if (i == partition - 1) {
array.append(dateFormat.format(minTime) -> dateFormat.format(maxTime))
} else {
array.append(dateFormat.format(minTime) -> dateFormat.format(midNum))
}
}
}
//根据时间划分区间,并且左闭右开,避免数据时间点重叠
resultArray = array.toArray.map {
case (start, end) => s"'${start}'<= ${colum} and ${colum} < '${end}'"
}
//将最后一个时间区间范围改为闭区间
resultArray.update(resultArray.size - 1, resultArray.last.replaceAll(s"${colum} <", s"${colum} <="))
println(resultArray.mkString(" " + "\n"))
resultArray
}
}
相关推荐
SparkSQL 操作数据库以及代码实践
作者:禅与计算机程序设计艺术 1.简介 一、关于本文 SparkSQL是Apache Spark项目中用于处理结构化数据的开源模块。它提供了简单易用的API,能够将关系型数据库中的数据转换成DataFrame对象,方便进行各种分析查询。在实际生产环境中,Spar
spark创建空dataframe
源码中已经很明确告诉我们,emptyDataFrame创建了一个不含任何行列且schema为空的dataframe。项目中会需要用到创建空的dataframe。spark提供了emptyDataFrame方法,可以直接创建。错误信息也很直观,emptydf是0 columns,df是2 columns,所以无法直接union。为了解决上面的问题,我们需要在生成emptyDataFrame的时候指定schema。这个空的dataframe在实际中用途有限,比如如下场景。上面的方法运行时候直接抛出错误信息。
Spark创建空的DataFrame
我的原创地址:https://dongkelun.com/2018/08/14/sparkEmptyDataFrame/ 前言 本文主要给出Spark创建空的DataFrame的代码示例,这里讲的空的DataFrame主要指有列名(可以自己随意指定),但是没有行的DataFrame,因为自己在开发过程中有这个需求,之前并不知道怎么创建,就查了一下,发现资料并不多,不知道因为太简单还是用的人少~......
Spark读取mysql(jdbc)数据分区两种API
Spark读取mysql(jdbc)数据分区两种API
实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?
本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。
ChatGPT and Claude国内使用站点
这篇博客介绍了不同的AI聊天平台和定价信息,主要对比了ChatGPT和Claude两款产品。文章列出了多个提供聊天服务的AI平台,包括RawChat、ChatGPTPlus、ChatOpens、Wildcard和2233.ai等,并提供了每个平台的网页链接和定价详情。特别关注了Claude平台,介绍了其普通账号与会员账号的不同,以及相关的定价信息。此外,还提到了一些虚拟卡定价和服务细节,为用户选择合适的AI服务提供了多种参考。
spark不同数据源读取
2019独角兽企业重金招聘Python工程师标准>>> ...
把MinerU集成到Dify
本文介绍了如何将本地部署的MinerU与Dify平台进行集成。首先需要确保Dify和MinerU在Docker环境中正常运行,并通过配置虚拟网络实现互联。然后详细说明了在Dify平台安装MinerU插件的步骤,包括从插件市场搜索安装、配置连接参数等关键操作。特别强调了要等待MinerU容器完全启动(healthy状态)后再进行Dify配置,否则会出现连接错误。通过简单的URL指向和API密钥设置,用户即可实现Dify平台与本地MinerU算力网络的对接,为后续的AI应用开发提供基础支持。
在EMR上执行 java spark sql 读写 s3 csv文件,存储RDS mysql
java写了一段从AWS s3读取csv文件,并使用spark sql处理后结果保存到mysql数据库,并写入到s3上csv文件的代码如下: package org.example.JavaDemo; import org.apache.spark.SparkConf; import org.apache.spark.SparkContext; import org.apache.spark...
系统安装、qt配置、安装pcie驱动
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.
YOLOv8【第七章:损失函数篇·第1节】一文搞定,IoU系列损失函数!
🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。
mysql设计文档_mysql设计
云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于...
dToF直方图之美_deadtime死区时间
IMX459的死区时间可以在6ns,这个时间是什么级别,车载激光雷达激光器的光脉宽一般都在4ns以上,也就是这个时间贴近去SPAD的死区时间,这就导致了pile up会非常弱,不会有太多数量的光子计数堆积,加上某些SPAD设计,对TDC有一些更深入的考量,所以不需要去校正pile up算法。Sensor层面决定了pile up的复杂程度,如果一个dToF的SPAD一致性非常好,那么pile up校正可以简单到极致,也就是一句代码的事,比如IMX611,优秀到不需要后端去考虑校正pile up。
spark删除mysql记录_mysql数据库删除一条记录
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平...
32、社交媒体大数据中的情感分析与网络欺凌检测
本文探讨了社交媒体大数据在情感分析和网络欺凌检测中的应用。情感分析有助于应对自动化带来的社会变化、促进社会包容和推动环境保护。网络欺凌作为一种严重的在线危害,其检测依赖于数据预处理、特征提取与深度学习模型(如CNN、LSTM)进行分类。文章还总结了大数据在欺诈检测、医疗、制造、交通等领域的广泛应用,并分析了数据存储、处理速度、质量和技术工具等方面的挑战,提出了相应的应对策略。未来,随着技术进步,社交媒体大数据将在更多领域发挥关键作用。
将任意文件转换为Pcap网络数据包传输
一款实用的工具用于将任意文件转换为pcap网络数据包
mysql怎么没有中文手册_mysql 中文手册
云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于...
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
java之MySQL的使用
1、MySQL概要 关系型数据库。—Access数据库 oracle数据库、Postgresql- 非关系型数据库。—-Hbase等 库:—package 表:–class 字段:–属性 Oracle旗下产品—-分两种 (GPL协议的 社区版和企业版) CDH HDP–后面大数据给大家讲 Apache–hive hdfs hadoop RDBMS:关系数据库管...
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
spark 写mysql 设置主键_数据库事务系列-MySQL跨行事务模型
说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务。虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比较上层。好在周边都是MySQL内核神级人物,在他们的熏陶下多多少少对MySQL的一些基本知识有一些零碎的记录和模糊的认识,这些基础对于今天整理理解MySQL跨行事务模...
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
数据库帮助文档链接
Oracle 帮助文档 11g : https://docs.oracle.com/cd/E11882_01/index.htm DB2 帮助文档 V11.1 Knowledge Center : https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/w...
云动态摘要 2024-07-15
给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。
实时流式CDC Debezium
问题导读: 1.什么是Debezium? 2.我们能用Debezium做些什么? 3.如何看待Debezium常规使用架构? 1. 什么是DebeziumDebezium是一个开源的分布式平台,用于捕捉变化数据(change data capture)的场景。它可以捕捉数据库中的事件变化(例如表的增、删、改等),并将其转为事件流,使得下游应用可以看到这些变化,并作出指定响应。2. Debezium常规使用架构根据Debezium官网[1]提供的常规使用的架构图: 可以看到,在对RMSDB数据..
spark导入mysql建表_spark sql执行流程
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server,具有企业许可授权,权限更为开放,引擎功能更为强大。能完美支持Windows平台的.NET架构,支持复杂SQL查询,性能优秀,并有强...
从淘汰Oracle数据库的事情说起
公司搞淘汰Oracle数据库的事情已经搞了好久了,这个事情其实和国内淘宝系搞的去IOE(IBM、Oracle和EMC)是类似的,基本上也是迫不得已,Oracle的维护成本太高,而公司内部基于Oracle数据库的数据仓库,也是问题频出;另一个原因则是scalability。我相信这两个原因许多人都非常清楚。而这个淘汰,也不是简简单单换一个关系数据库,比如把Oracle换成MySQL,或者换到云上(R
TiDB 助力客如云餐饮 SaaS 服务
作者:客如云 BigData Infra Team 公司介绍 客如云成立于 2012 年,是全球领先、 国内最大的 SaaS 系统公司。 目前面向餐饮、 零售等服务业商家, 提供软硬一体的新一代智能化前台、收银等 SaaS 云服务,包括预订、排队、外卖、点餐、收银、会员管理、进销存等系统服务,并将数据实时传达云端。我们是客如云的大数据基础架构组,负责...
3412



被折叠的 条评论
为什么被折叠?



