spark导入mysql建表_Spark操作dataFrame进行写入mysql,自定义sql的方式

本文介绍了如何在Spark中使用DataFrame并通过自定义SQL语句,利用c3p0连接池写入MySQL数据库。内容包括:创建连接池、处理主键限制、指定字段写入、更新操作等。示例代码详细展示了数据写入过程。
摘要由CSDN通过智能技术生成

业务场景:

现在项目中需要通过对spark对原始数据进行计算,然后将计算结果写入到mysql中,但是在写入的时候有个限制:

1、mysql中的目标表事先已经存在,并且当中存在主键,自增长的键id

2、在进行将dataFrame写入表的时候,id字段不允许手动写入,因为其实自增长的

要求:

1、写入数据库的时候,需要指定字段写入,也就是说,只指定部分字段写入

2、在写入数据库的时候,对于操作主键相同的记录要实现更新操作,非插入操作

分析:

spark本身提供了对dataframe的写入数据库的操作,即:

/**

* SaveMode is used to specify the expected behavior of saving a DataFrame to a data source.

*

* @since 1.3.0

*/

public enum SaveMode {

/**

* Append mode means that when saving a DataFrame to a data source, if data/table already exists,

* contents of the DataFrame are expected to be appended to existing data.

*

* @since 1.3.0

*/

Append,

/**

* Overwrite mode means that when saving a DataFrame to a data source,

* if data/table already exists, existing data is expected to be overwritten by the contents of

* the DataFrame.

*

* @since 1.3.0

*/

Overwrite,

/**

* ErrorIfExists mode means that when saving a DataFrame to a data source, if data already exists,

* an exception is expected to be thrown.

*

* @since 1.3.0

*/

ErrorIfExists,

/**

* Ignore mode means that when saving a DataFrame to a data source, if data already exists,

* the save operation is expected to not save the contents of the DataFrame and to not

* change the existing data.

*

* @since 1.3.0

*/

Ignore

}

但是,显然这种方式写入的时候,需要我们的dataFrame中的每个字段都需要对mysql目标表中相对应,在写入的时候需要全部字段都写入,这是种方式简单,但是这不符合我们的业务需求,所以我们需要换一种思路,也就是说,如果我们能够通过自定义insert语句的方式,也就是说通过jdbc的方式进行写入数据,那就更好了。这样也更符合我们的业务需求。

具体实现(开发环境:IDEA):

实现方式:通过c3p0连接池的方式进行数据的写入,这样我们就可以直接通过自己拼接sql,来实现我们需要插入数据库的指定的字段值,当然这种方式实现起来也比较繁琐。

第一步:

我们需要先导入响应的依赖包:

sbt项目导入方式:

打开build.sbt文件

在红色框出进行添加即可

maven项目导入方式:

mysql

mysql-connector-java

6.0.6

com.mchange

c3p0

0.9.5

我习惯与将关于数据库操作的几个库类放到单独的一个BDUtils包中

第一步:定义读取配置文件的类

package cn.com.xxx.audit.DBUtils

import java.util.Properties

object PropertiyUtils {

def getFileProperties(fileName: String, propertityKey: String): String = {

val result = this.getClass.getClassLoader.getResourceAsStream(fileName)

val prop = new Properties()

prop.load(result)

prop.getProperty(propertityKey)

}

}

第二步:定义一个配置文件(db.properties),将该文件放在resource目录中,并且内容使用"="进行连接

db.propreties

mysql.jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC

mysql.jdbc.host=127.0.0.1

mysql.jdbc.port=3306

mysql.jdbc.user=root

mysql.jdbc.password=123456

mysql.pool.jdbc.minPoolSize=20

mysql.pool.jdbc.maxPoolSize=50

mysql.pool.jdbc.acquireIncrement=10

mysql.pool.jdbc.maxStatements=50

mysql.driver=com.mysql.jdbc.Driver

第三步:定义一个连接池的类,负责获取配置文件,并创建数据库连接池

package cn.com.xxx.audit.DBUtils

import java.sql.Connection

import com.mchange.v2.c3p0.ComboPooledDataSource

class MySqlPool extends Serializable {

private val cpds: ComboPooledDataSource = new ComboPooledDataSource(true)

try {

cpds.setJdbcUrl(PropertiyUtils.getFileProperties("db.properties", "mysql.jdbc.url"))

cpds.setDriverClass(PropertiyUtils.getFileProperties("db.properties", "mysql.driver"))

cpds.setUser(PropertiyUtils.getFileProperties("db.properties", "mysql.jdbc.user"))

cpds.setPassword(PropertiyUtils.getFileProperties("db.properties", "mysql.jdbc.password"))

cpds.setMinPoolSize(PropertiyUtils.getFileProperties("db.properties", "mysql.pool.jdbc.minPoolSize").toInt)

cpds.setMaxPoolSize(PropertiyUtils.getFileProperties("db.properties", &#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. Spark SQL RDD基本操作Spark SQL RDD是一种分布式数据集,可以通过Spark SQL API进行操作。基本操作包括创建RDD、转换RDD、持久化RDD、计算RDD等。可以使用Spark SQL RDD API中的函数进行操作,如map、filter、reduce等。 2. RDD-DataFrame:RDD和DataFrameSpark SQL中的两种数据结构。RDD是弹性分布式数据集,而DataFrame是一种结构化数据集。可以通过将RDD转换为DataFrame进行数据分析和处理。可以使用Spark SQL中的API将RDD转换为DataFrame,如toDF、createDataFrame等。 3. API MySQL:API MySQL是一种用于访问MySQL数据库的应用程序接口。可以使用API MySQL来连接MySQL数据库并进行数据操作,如查询、插入、更新、删除等。在Spark SQL中,可以使用API MySQL来读取和写入MySQL数据库中的数据。可以使用Spark SQL中的API来连接MySQL数据库,如JDBC、ODBC等。 ### 回答2: Spark SQL中RDD是一种基础数据结构,它是Resilient Distributed Dataset的简称,即弹性分布式数据集。RDD具有不可变性、分区性和良好的容错性,可以通过多种方式创建。RDD的基本操作包括转换操作和行动操作。转换操作是指基于源数据生成一个新的RDD,而不改变源数据。常见的转换操作包括map、filter和reduceByKey等。行动操作是指触发数据的计算并返回结果。常见的行动操作包括collect、count和reduce等。RDD的优势在于能够在内存中处理海量数据,提高处理速度和效率。 RDD与DataFrameSpark SQL的两种核心数据结构。DataFrame是一个二维表格式的数据集合,可以通过多种方式创建,包括从RDD转换而来、读取外部数据源等。与RDD相比,DataFrame有更丰富的API支持和更高的性能优化,同时也提供了SQL查询等类似于关系型数据库的操作DataFrame的基本操作包括列选择、过滤、聚合等。 在使用Spark SQL时,还需要连接外部数据源进行数据读取和写入。常见的外部数据源包括MySQL等关系型数据库。Spark SQL可以通过多种方式连接MySQL,包括使用JDBC和使用DataFrame API。使用JDBC需要在代码中明确连接MySQL的URL、用户名和密码等信息,使用DataFrame API可以通过定义schema和指定数据源路径等方式进行数据读取和写入。连接MySQL需要注意代码的安全性和性能问题。 综上所述,Spark SQL中RDD、DataFrame和连接外部数据源的API都是使用Spark进行大数据处理的重要组成部分。熟练掌握这些基本操作和API可以提高数据分析和处理的效率和可靠性。 ### 回答3: Spark SQL RDD基本操作Spark SQL中,RDD操作是非常基础且非常重要的。Spark SQL RDD的操作可以通过直接调用RDD的API实现,常见的RDD操作有filter、map、reduce等。 1. filter:用于筛选符合条件的元素,过滤掉其余的元素。例如,过滤并输出RDD中包含“spark”的元素: rdd.filter(lambda x: "spark" in x).collect() 2. map:用于将每个元素按照一定的规则进行映射,例如将RDD中的每个元素都变成大写: rdd.map(lambda x: x.upper()).collect() 3. reduce:用于按照规定的操作对RDD进行迭代归约,例如对RDD中的元素进行相加求和: rdd.reduce(lambda x, y: x+y) RDD-DataFrame Spark SQL支持RDD与DataFrame的相互转换。RDD是Spark的最基本数据结构之一,DataFrame是一种用于处理结构化数据的API,基于RDD开发而成。 使用RDD创建DataFrame,需要先将RDD映射为Row类型,再通过StructType定义的schema将Row映射为DataFrame。例如: from pyspark.sql import Row from pyspark.sql.types import StructType, StructField, StringType rdd = sc.parallelize([(1, "John"), (2, "Andy"), (3, "Smith")]) row_rdd = rdd.map(lambda x: Row(id=x[0], name=x[1])) schema = StructType([StructField("id", StringType(), True), StructField("name", StringType(), True)]) df = spark.createDataFrame(row_rdd, schema) 使用DataFrame创建RDD,可以使用rdd属性直接将DataFrame转换为RDD。例如: rdd = df.rdd API MySQL Spark SQL可以通过连接MySQL数据库获取数据并进行处理,有两种方法:JDBC和Spark SQL官方提供的DataFrame API。使用JDBC需要先进行MySQL的配置,然后通过JDBC连接到MySQL数据库并读取数据,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() url = "jdbc:mysql://localhost:3306/mydatabase" properties = {"user": "root", "password": "xxx"} query = "(select * from mytable) as mytable" df = spark.read.jdbc(url=url, table=query, properties=properties) 而使用Spark SQL官方提供的DataFrame API,可以使用read.format连同jdbc并指定数据库地址、用户名、密码等参数,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() df = spark.read.format("jdbc"). \ option("url", "jdbc:mysql://localhost:3306/mydatabase"). \ option("user", "root"). \ option("password", "xxx"). \ option("dbtable", "(select * from mytable) as mytable"). \ load() 两种方法均可以完成对MySQL数据库的读取和数据处理。 总结 Spark SQL的RDD操作、RDD-DataFrame转换以及MySQL API均为Spark SQL的基本操作。可以利用这些基本操作实现Spark SQL中的数据处理、计算和分析等功能。同时,Spark SQL还提供了丰富的API和函数库,可以根据具体需求在其基础上进行拓展和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值