当前位置:   article > 正文

Spark-SQL连接JDBC的方式及代码写法_spark.read.jdbc

spark.read.jdbc

提示:文章内容仅供参考!

一、数据加载与保存

通用方式:

SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet

加载数据:

spark.read.load 是加载数据的通用方法。如果读取不同格式的数据,可以对不同的数据格式进行设定。

spark.read.format("…")[.option("…")].load("…")

➢ format("…"):指定加载的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和

"textFile"。

➢ load("…"):在"csv"、"jdbc"、"json"、"orc"、"parquet"和"textFile"格式下需要传入加载

数据的路径。

➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable

我们前面都是使用 read API 先把文件加载到 DataFrame 然后再查询,其实,我们也可以直接在文件上进行查询: 文件格式.`文件路径`

spark.sql("select * from json.’/opt/module/data/user.json’").show

保存数据:

df.write.save 是保存数据的通用方法。如果保存不同格式的数据,可以对不同的数据格式进行设定。

df.write.format("…")[.option("…")].save("…")

➢ format("…"):指定保存的数据类型,包括"csv"、"jdbc"、"json"、"orc"、"parquet"和

"textFile"。

➢ save ("…"):在"csv"、"orc"、"parquet"和"textFile"格式下需要传入保存数据的路径。

➢ option("…"):在"jdbc"格式下需要传入 JDBC 相应参数,url、user、password 和 dbtable

保存操作可以使用 SaveMode, 用来指明如何处理数据,使用 mode()方法来设置。

例如:df.write.mode("append").json("/opt/module/data/output")

二、Parquet

Spark SQL 的默认数据源为 Parquet 格式。Parquet 是一种能够有效存储嵌套数据的列式

存储格式。数据源为 Parquet 文件时,Spark SQL 可以方便的执行所有的操作,不需要使用 format。修改配置项 spark.sql.sources.default,可修改默认数据源格式。

加载数据:

val df = spark.read.load("examples/src/main/resources/users.parquet")

保存数据:

  1. var df = spark.read.json("/opt/module/data/input/people.json")
  2. df.write.mode("append").save("/opt/module/data/output")

三、JSON

Spark SQL 能够自动推测 JSON 数据集的结构,并将它加载为一个 Dataset[Row]. 可以

通过 SparkSession.read.json()去加载 JSON 文件。注意:Spark 读取的 JSON 文件不是传统的 JSON 文件,每一行都应该是一个 JSON 串

加载json文件

val path = "/opt/module/spark-local/people.json"

val peopleDF = spark.read.json(path)

创建临时表

peopleDF.createOrReplaceTempView("people")

数据查询

val resDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")

四、CSV

Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为

数据列。

spark.read.format("csv").option("sep",";").option("inferSchema","true")

.option("header", "true").load("data/user.csv")

  1. 数据准备:user.csv

 

2.读取 CSV 文件

  1. import org.apache.spark.SparkConf
  2. import org.apache.spark.sql.SparkSession
  3. object JDBCTest {
  4. def main(args: Array[String]): Unit = {
  5. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  6. val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  7. spark.read.format("csv").option("sep",";").option("inferSchema","true")
  8. .option("header", "true").load("data/user.csv").show()
  9. spark.stop()
  10. }
  11. }

执行结果:

 五、MySQL

Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame,通过对

DataFrame 一系列的计算后,还可以将数据再写回关系型数据库中。

IDEA通过JDBC对MySQL进行操作:

  1. 导入依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
</dependency>

2)mysql中user表:

 

3)读取数据

1.通用的load方法:

  1. mport org.apache.spark.SparkConf
  2. import org.apache.spark.sql.{DataFrame, SparkSession}
  3. import java.util.Properties
  4. object JDBCTest {
  5. def main(args: Array[String]): Unit = {
  6. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  7. val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  8. import spark.implicits._
  9. //通用的load方式读取
  10. spark.read.format("jdbc")
  11. .option("url", "jdbc:mysql://node01:3306/system")
  12. .option("driver", "com.mysql.jdbc.Driver")
  13. .option("user", "root")
  14. .option("password", "123456")
  15. .option("dbtable", "user")
  16. .load().show()
  17. spark.stop()
  18. }
  19. }

执行结果:

2. 通用的load方法的另一种形式:

  1. mport org.apache.spark.SparkConf
  2. import org.apache.spark.sql.SparkSession
  3. object JDBCTest {
  4. def main(args: Array[String]): Unit = {
  5. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  6. val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  7. import spark.implicits._
  8. //通用的load方法的另一种形式
  9. spark.read.format("jdbc")
  10. .options(
  11. Map("url"->"jdbc:mysql://node01:3306/system?user=root&password=123456","dbtable"->"user","driver"->"com.mysql.jdbc.Driver"))
  12. .load().show()
  13. spark.stop()
  14. }
  15. }

执行结果:

 3.通过JDBC:

  1. import org.apache.spark.SparkConf
  2. import org.apache.spark.sql.{DataFrame, SparkSession}
  3. import java.util.Properties
  4. object JDBCTest {
  5. def main(args: Array[String]): Unit = {
  6. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  7. val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  8. import spark.implicits._
  9. //通过JDBC
  10. val pros :Properties = new Properties()
  11. pros.setProperty("user","root")
  12. pros.setProperty("password","123456")
  13. val df :DataFrame = spark.read.jdbc("jdbc:mysql://node01:3306/system","user",pros)
  14. df.show()
  15. }
  16. }

执行结果:

 4.写入数据

注:写入数据时保存数据的表由程序自动创建,不可以提前创建

方法一:

  1. mport org.apache.spark.SparkConf
  2. import org.apache.spark.sql.{ SaveMode, SparkSession}
  3. case class Stu(name:String,age:Int)
  4. object JDBCTest {
  5. def main(args: Array[String]): Unit = {
  6. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  7. val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  8. import spark.implicits._
  9. val rdd = spark.sparkContext.makeRDD(
  10. List((Stu("zhangsan",20)),Stu("lisi",23))
  11. )
  12. val ds = rdd.toDS()
  13. ds.write.format("jdbc")
  14. .option("url","jdbc:mysql://node01:3306/system")
  15. .option("driver","com.mysql.jdbc.Driver")
  16. .option("user","root")
  17. .option("password","123456")
  18. .option("dbtable","user2")
  19. .mode(SaveMode.Append)
  20. .save()
  21. spark.stop()
  22. }
  23. }

执行结果:

 进入MySQL数据库查看结果:

 方法二:

  1. import org.apache.spark.SparkConf
  2. import org.apache.spark.sql.{SaveMode, SparkSession}
  3. case class Stu(name:String,age:Int)
  4. object JDBCTest {
  5. def main(args: Array[String]): Unit = {
  6. val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SQL")
  7. val spark:SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
  8. import spark.implicits._
  9. val rdd = spark.sparkContext.makeRDD(
  10. List((Stu("zhangsan",20)),Stu("lisi",23))
  11. )
  12. val ds = rdd.toDS()
  13. ds.write.format("jdbc")
  14. .options( Map("url"->"jdbc:mysql://node01:3306/system?user=root&password=123456","dbtable"->"user3","driver"->"com.mysql.jdbc.Driver"))
  15. .mode(SaveMode.Append)
  16. .save()
  17. spark.stop()
  18. }
  19. }

执行结果:

 进入MySQL数据库查看结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/593325
推荐阅读
相关标签
  

闽ICP备14008679号