sparkSQL 写数据到MySQL的几种模式解释以及overwrite模式在不删除表结构的情况下的实现

本文介绍了在使用Spark进行数据操作时,针对Mysql数据库的四种数据存储模式:ErrorIfExists、Append、Overwrite和Ignore,并详细解释了如何在不删除已有表的情况下使用Overwrite模式来覆盖原有数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、数据存入Mysql 几种模式
  默认为SaveMode.ErrorIfExists模式,该模式下,若数据库中已经存在该表,则会直接报异常,导致数据不能存入数据库;
  SaveMode.Append 若表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据;
  SaveMode.Overwrite 重写模式,其本质是先将已有的表及其数据全都删除,再重新创建该表,然后插入新的数据;
  SaveMode.Ignore 若表不存在,则创建表,并存入数据;若表存在的情况下,直接跳过数据的存储,不会报错。

2、SaveMode.Overwrite模式在不删除已有的表的情况下即保留表结构的情况下,覆盖原有数据的实现
eg:

        <!--sqlserver数据库访问-->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>7.0.0.jre8</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <!--mysql数据库访问-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
            <scope>provided</scope>
        </dependency>
import java.sql.DriverManager
import java.util.Properties

import org.apache.spark.sql.{SaveMode, SparkSession}

object OverWrite {
  def main(args: Array[String]): Unit = {
    val ss = SparkSession
      .builder()
      .appName("OverWrite")
      .master("local")
      //.config("spark.sql.warehouse.dir", "file:///D://lenovo_pj//cpp//cpp")
      .getOrCreate()

    val url      = "jdbc:mysql://10.96.91.186:3306/lenovo_channel_persona?rewriteBatchedStatements=true&" +
      "useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"
    val driver   = "com.mysql.jdbc.Driver"
    val user     = "root"
    val password = "123456"

    val prop = new Properties
    prop.setProperty("user",user)
    prop.setProperty("password",password)
    prop.setProperty("driver",driver)
    prop.setProperty("charset","UTF-8")

    val arr = Array("aa","bb","cc")
    val tableName = "test_overwrite"

    //先清空MySQL表
    Class.forName(driver)
    val conn = DriverManager.getConnection(url,prop)
    val sm = conn.prepareCall("truncate table "+tableName)
    sm.execute()
    sm.close()

    //在往MySQL表追加数据
    import ss.sqlContext.implicits._
    ss.sparkContext
      .parallelize(arr)
      .toDF("node1","node2","node3")
      .write
      .mode(SaveMode.Append)
      .jdbc(url,tableName,prop)

    conn.close()
    ss.stop()
  }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会飞的乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值