Spark SQL百万级数据批量读写入MySQL

Spark SQL读取MySQL的方式

Spark SQL还包括一个可以使用JDBC从其他数据库读取数据的数据源。与使用JdbcRDD相比,应优先使用此功能。这是因为结果作为DataFrame返回,它们可以在Spark SQL中轻松处理或与其他数据源连接。JDBC数据源也更易于使用Java或Python,因为它不需要用户提供ClassTag。

可以使用Data Sources API将远程数据库中的表加载为DataFrame或Spark SQL临时视图。用户可以在数据源选项中指定JDBC连接属性。 user和password通常作为用于登录数据源的连接属性。除连接属性外,Spark还支持以下不区分大小写的选项:

属性名称 解释
url 要连接的JDBC URL
dbtable 读取或写入的JDBC表
query 指定查询语句
driver 用于连接到该URL的JDBC驱动类名
partitionColumn, lowerBound, upperBound 如果指定了这些选项,则必须全部指定。另外, numPartitions必须指定
numPartitions 表读写中可用于并行处理的最大分区数。这也确定了并发JDBC连接的最大数量。如果要写入的分区数超过此限制,我们可以通过coalesce(numPartitions)在写入之前进行调用将其降低到此限制
queryTimeout 默认为0,查询超时时间
fetchsize JDBC的获取大小,它确定每次要获取多少行。这可以帮助提高JDBC驱动程序的性能
batchsize 默认为1000,JDBC批处理大小,这可以帮助提高JDBC驱动程序的性能。
isolationLevel 事务隔离级别,适用于当前连接。它可以是一个NONEREAD_COMMITTEDREAD_UNCOMMITTEDREPEATABLE_READ,或SERIALIZABLE,对应于由JDBC的连接对象定义,缺省值为标准事务隔离级别READ_UNCOMMITTED。此选项仅适用于写作。
sessionInitStatement 在向远程数据库打开每个数据库会话之后,在开始读取数据之前,此选项将执行自定义SQL语句,使用它来实现会话初始化代码。
truncate 这是与JDBC writer相关的选项。当SaveMode.Overwrite启用时,就会清空目标表的内容,而不是删除和重建其现有的表。默认为false
pushDownPredicate 用于启用或禁用谓词下推到JDBC数据源的选项。默认值为true,在这种情况下,Spark将尽可能将过滤器下推到JDBC数据源。

源码

  • SparkSession
/**
   * Returns a [[DataFrameReader]] that can be used to read non-streaming data in as a
   * `DataFrame`.
   * {
   {
   {
   *   sparkSession.read.parquet("/path/to/file.parquet")
   *   sparkSession.read.schema(schema).json("/path/to/file.json")
   * }}}
   *
   * @since 2.0.0
   */
  def read: DataFrameReader = new DataFrameReader(self)
  • DataFrameReader
  // ...省略代码...
  /**
   *所有的数据由RDD的一个分区处理,如果你这个表很大,很可能会出现OOM
   *可以使用DataFrameDF.rdd.partitions.size方法查看
   */
  def jdbc(url: String, table: String, properties: Properties): DataFrame = {
   
    assertNoSpecifiedSchema("jdbc")
    this.extraOptions ++= properties.asScala
    this.extraOptions += (JDBCOptions.JDBC_URL -> url, JDBCOptions.JDBC_TABLE_NAME -> table)
    format("jdbc").load()
  }
/**
   * @param url 数据库url
   * @param table 表名
   * @param columnName 分区字段名
   * @param lowerBound  `columnName`的最小值,用于分区步长
   * @param upperBound  `columnName`的最大值,用于分区步长.
   * @param numPartitions 分区数量 
   * @param connectionProperties 其他参数
   * @since 1.4.0
   */
  def jdbc(
      url: String,
      table: String,
      columnName: String,
      lowerBound: Long,
      upperBound: Long,
      numPartitions: Int,
      connectionProperties: Properties): DataFrame =
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spark SQL可以通过JDBC连接MySQL数据库,实现百万级数据批量写。具体步骤如下: 1. 在Spark SQL数据,可以使用DataFrame或者Dataset API,也可以使用SQL语句查询数据。 2. 将取的数据转换为需要写入MySQL的格式,可以使用Spark SQL提供的函数进行转换。 3. 使用JDBC连接MySQL数据库,将数据批量写入MySQL中。可以使用Spark SQL提供的JDBC接口,也可以使用第三方的JDBC库。 需要注意的是,批量写入MySQL时需要考虑数据量的大小和MySQL的性能限制,可以采用分批写入的方式,或者使用MySQL批量插入功能。同时,还需要考虑数据的一致性和完整性,可以使用事务来保证数据的正确性。 ### 回答2: 针对spark sql百万级数据批量写入mysql,需要按照以下步骤进行: 1、准备环境 安装Spark以及MySQL数据库,并在Spark环境中添加MySQL JDBC驱动程序以实现访问MySQL数据库。 2、创建表 在MySQL中创建表以存储数据,在Spark中创建相应的DataFrame以存储取的数据。 3、数据 使用Spark SQL取百万级别的数据,并将其存储在DataFrame中。 4、数据处理 对于取的数据,可能需要进行数据清洗、转换、过滤等操作,以满足业务需求。 5、写入数据 将处理后的数据批量写入MySQL数据库中,可以使用Spark SQL中的JDBC连接器实现。 同时需要注意以下几点: 1、配置Spark 为了确保Spark可以处理任意大小的文件,需要在Spark配置中进行相应的调整,例如通过调整参数spark.executor.memory和spark.driver.memory来增加内存容量等。 2、分区 为了充分利用Spark并行处理的能力,可以将取的数据分成几个分区,以便Spark可以同时处理多个数据块。 3、缓存 有时需要缓存数据以提高处理性能,Spark提供了cache()函数可以将数据持久化在内存中,以便后续使用时能够快速访问。 4、数据类型映射 由于SparkMySQL使用不同的数据类型,所以需要进行相应的数据类型映射操作。 总之,通过合理的环境准备、数据处理以及数据写入方式,可以实现spark sql百万级数据批量写入mysql的高效处理。 ### 回答3: 在进行Spark SQL百万级数据批量写入MySQL的过程中,有几个方面需要注意。首先,需要保证在Spark集群的环境下,数据取和处理能够高效地进行。其次,在数据写入MySQL时,需要考虑到MySQL的性能和调优问题。 对于数据取和处理方面,在Spark SQL中可以使用DataFrame和Dataset API来进行操作,这两个API能够支持大规模的数据处理,并且具有自动优化性能的特点。同时,在数据时,可以考虑使用分区和缓存等机制来提高取速度。例如,在数据时可以使用分区取,将数据分散到多台机器上进行取,在数据处理时也可以缓存数据以避免重复取。 在数据写入MySQL时,需要考虑到MySQL的性能和调优问题。首先需要保证MySQL的配置能够满足大规模数据写入的需求,例如适当调整缓冲区大小、写缓存、线程数量以及数据库的连接池等。其次,在数据写入时,可以使用批量写入的方式来提高写入效率。可以使用JDBC批量写入、MyBatis批量写入或者第三方插件如Hibernate等来实现批量写入操作。同时,在写入数据时可以考虑将数据分批写入,以避免MySQL写入性能受到过大的影响。 总体来说,在进行Spark SQL百万级数据批量写入MySQL时,需要考虑到数据取、处理和写入的效率和性能问题。需要综合使用多个技术手段来保证数据写的高效性和稳定性,从而满足业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值