sparksql 多分区读RDS的两种方式(mysql 为例)

使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖 1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好、更快的决策。Amazon Simple Storage Service(amazon S3)是针对结构化和非结构化数据的高性能对象存储服务,可以用来作为数据湖底层的存储服务。 然而许多用例,如从上游关系数据库执行变更数据捕获(CDC)到基于Amazon S3的数据湖,都需要在记录级别处理数据,执行诸如从数据集中插入、更新和删除单条记录的操作需要处理引擎读取所有对象(文件),进行更改,并将整 阅读详情
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
  }
}
【实践案例】Databricks 数据洞察 Delta Lake 在基智科技(STEPONE)的应用实践 简介:获取更详细的 Databricks 数据洞察相关信息,可至产品详情页查看:https://www.aliyun.com/product/bigdata/spark 作者 高爽,基智科技数据中心负责人 尚子钧,数据研发工程师 1、基智科技 北京基智科技有限公司是一家提供智能营销服务的科技公司。公司愿景是基于 AI 和大数据分析为 B2B 企业提供全流程的智能营销服务。公司秉承开放,挑战,专业,创新的价值观从线索挖掘到 AI 智达、CRM 客户管理覆盖客户全生命周期,实现全渠道的营销和数据分析决. 阅读详情

相关推荐

SparkSQL 操作数据库以及代码实践

作者:禅与计算机程序设计艺术 1.简介 一、关于本文 SparkSQL是Apache Spark项目中用于处理结构化数据的开源模块。它提供了简单易用的API,能够将关系型数据库中的数据转换成DataFrame对象,方便进行各种分析查询。在实际生产环境中,Spar

AI天才研究院 3412

spark创建空dataframe

源码中已经很明确告诉我们,emptyDataFrame创建了一个不含任何行列且schema为空的dataframe。项目中会需要用到创建空的dataframe。spark提供了emptyDataFrame方法,可以直接创建。错误信息也很直观,emptydf是0 columns,df是2 columns,所以无法直接union。为了解决上面的问题,我们需要在生成emptyDataFrame的时候指定schema。这个空的dataframe在实际中用途有限,比如如下场景。上面的方法运行时候直接抛出错误信息。

bitcarmanlee的博客 1138

Spark创建空的DataFrame

我的原创地址:https://dongkelun.com/2018/08/14/sparkEmptyDataFrame/ 前言 本文主要给出Spark创建空的DataFrame的代码示例,这里讲的空的DataFrame主要指有列名(可以自己随意指定),但是没有行的DataFrame,因为自己在开发过程中有这个需求,之前并不知道怎么创建,就查了一下,发现资料并不多,不知道因为太简单还是用的人少~......

主要分享大数据相关的知识,如Spark、Hudi 1万+

Spark读取mysql(jdbc)数据分区两种API

Spark读取mysql(jdbc)数据分区两种API

mrye的博客 957

实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?

本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。

weixin_42634811的博客 344

ChatGPT and Claude国内使用站点

这篇博客介绍了不同的AI聊天平台和定价信息,主要对比了ChatGPT和Claude两款产品。文章列出了多个提供聊天服务的AI平台,包括RawChat、ChatGPTPlus、ChatOpens、Wildcard和2233.ai等,并提供了每个平台的网页链接和定价详情。特别关注了Claude平台,介绍了其普通账号与会员账号的不同,以及相关的定价信息。此外,还提到了一些虚拟卡定价和服务细节,为用户选择合适的AI服务提供了多种参考。

nisidjndn的博客 1万+

spark不同数据源读取

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34261415的博客 723

把MinerU集成到Dify

本文介绍了如何将本地部署的MinerU与Dify平台进行集成。首先需要确保Dify和MinerU在Docker环境中正常运行,并通过配置虚拟网络实现互联。然后详细说明了在Dify平台安装MinerU插件的步骤,包括从插件市场搜索安装、配置连接参数等关键操作。特别强调了要等待MinerU容器完全启动(healthy状态)后再进行Dify配置,否则会出现连接错误。通过简单的URL指向和API密钥设置,用户即可实现Dify平台与本地MinerU算力网络的对接,为后续的AI应用开发提供基础支持。

lyxerlau的博客 313

在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...

Ace的专栏 981

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2204

YOLOv8【第七章:损失函数篇·第1节】一文搞定,IoU系列损失函数!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1195

mysql设计文档_mysql设计

云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于...

weixin_33833234的博客 305

dToF直方图之美_deadtime死区时间

IMX459的死区时间可以在6ns,这个时间是什么级别,车载激光雷达激光器的光脉宽一般都在4ns以上,也就是这个时间贴近去SPAD的死区时间,这就导致了pile up会非常弱,不会有太多数量的光子计数堆积,加上某些SPAD设计,对TDC有一些更深入的考量,所以不需要去校正pile up算法。Sensor层面决定了pile up的复杂程度,如果一个dToF的SPAD一致性非常好,那么pile up校正可以简单到极致,也就是一句代码的事,比如IMX611,优秀到不需要后端去考虑校正pile up。

dream it possible 1433

spark删除mysql记录_mysql数据库删除一条记录

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行数据压测演练,提供数据库优化方面专业建议,在业务高峰期与用户共同保障数据库系统平...

weixin_39678531的博客 399

32、社交媒体大数据中的情感分析与网络欺凌检测

本文探讨了社交媒体大数据在情感分析和网络欺凌检测中的应用。情感分析有助于应对自动化带来的社会变化、促进社会包容和推动环境保护。网络欺凌作为一种严重的在线危害,其检测依赖于数据预处理、特征提取与深度学习模型(如CNN、LSTM)进行分类。文章还总结了大数据在欺诈检测、医疗、制造、交通等领域的广泛应用,并分析了数据存储、处理速度、质量和技术工具等方面的挑战,提出了相应的应对策略。未来,随着技术进步,社交媒体大数据将在更多领域发挥关键作用。

cc789的博客 90

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3188

mysql怎么没有中文手册_mysql 中文手册

云数据库 MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于应用程序开发,无需为数据库运维烦恼价格低至¥0.24/小时起,买1年83折云数据库MySQL云数据库(RDS for MySQL)是稳定可靠、可弹性伸缩的云数据库服务。通过云数据库能够让您几分钟内完成数据库部署。云端完全托管,让您专注于...

weixin_30359591的博客 212

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:关系数据库管...

weixin_34038652的博客 154

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跨行事务模...

weixin_39700394的博客 222

廖雪峰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...

u010024893的专栏 183

云动态摘要 2024-07-15

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。

cloudcheap的博客 681

实时流式CDC Debezium

问题导读: 1.什么是Debezium? 2.我们能用Debezium做些什么? 3.如何看待Debezium常规使用架构? 1. 什么是DebeziumDebezium是一个开源的分布式平台,用于捕捉变化数据(change data capture)的场景。它可以捕捉数据库中的事件变化(例如表的增、删、改等),并将其转为事件流,使得下游应用可以看到这些变化,并作出指定响应。2. Debezium常规使用架构根据Debezium官网[1]提供的常规使用的架构图: 可以看到,在对RMSDB数据..

ytp552200ytp的博客 996

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查询,性能优秀,并有强...

weixin_42514107的博客 89

从淘汰Oracle数据库的事情说起

公司搞淘汰Oracle数据库的事情已经搞了好久了,这个事情其实和国内淘宝系搞的去IOE(IBM、Oracle和EMC)是类似的,基本上也是迫不得已,Oracle的维护成本太高,而公司内部基于Oracle数据库的数据仓库,也是问题频出;另一个原因则是scalability。我相信这两个原因许多人都非常清楚。而这个淘汰,也不是简简单单换一个关系数据库,比如把Oracle换成MySQL,或者换到云上(R

msyqmsyq的博客 4079

TiDB 助力客如云餐饮 SaaS 服务

作者:客如云 BigData Infra&nbsp;Team&nbsp; 公司介绍 客如云成立于 2012 年,是全球领先、 国内最大的 SaaS 系统公司。 目前面向餐饮、 零售等服务业商家, 提供软硬一体的新一代智能化前台、收银等&nbsp;SaaS 云服务,包括预订、排队、外卖、点餐、收银、会员管理、进销存等系统服务,并将数据实时传达云端。我们是客如云的大数据基础架构组,负责...

TiDB_PingCAP 的博客 1003
上一篇: SparkSql 解析 string json格式
HDP_CDH
博客等级 码龄9年 3粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值