Spark,SparkSQL操作Mysql, 创建数据库和表

一、环境准备

1. 下载 MySQL 驱动

- 下载  mysql-connector-java-x.x.x.jar ,放入 Spark 目录的  jars  文件夹(或提交任务时通过  --jars  参数指定)。

2. 启动 SparkSession

scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()

  .appName("Spark MySQL Example")

  .master("local[*]") // 本地模式,集群需调整

  .getOrCreate()

 

二、通过 SparkSQL 创建 MySQL 数据库

方式 1:使用原生 JDBC 执行 SQL

scala

import java.sql.{DriverManager, Connection}

// 注册 MySQL 驱动(可选,部分版本需手动注册)

Class.forName("com.mysql.cj.jdbc.Driver")

// 创建数据库连接

val conn: Connection = DriverManager.getConnection(

  "jdbc:mysql://localhost:3306/", // MySQL 连接地址(不带数据库名)

  "root", // 用户名

  "your_password" // 密码

)

// 执行创建数据库语句

val statement = conn.createStatement()

statement.executeUpdate("CREATE DATABASE IF NOT EXISTS test_db")

statement.close()

conn.close()

 

方式 2:通过 SparkSQL 直接提交命令(需支持 JDBC 执行)

scala

spark.sql(

  s"""

     |CREATE DATABASE test_db

     |USING jdbc

     |OPTIONS (

     | url 'jdbc:mysql://localhost:3306/',

     | driver 'com.mysql.cj.jdbc.Driver',

     | user 'root',

     | password 'your_password'

     |)

     |""".stripMargin

)

 

三、通过 SparkSQL 创建 MySQL 表

步骤 1:定义表结构(Schema)

scala

import org.apache.spark.sql.types._

val schema = StructType(

  Seq(

    StructField("id", IntegerType, nullable = false),

    StructField("name", StringType, nullable = true),

    StructField("age", IntegerType, nullable = true),

    StructField("create_time", TimestampType, nullable = true)

  )

)

 

步骤 2:创建表(通过 JDBC 写入空数据触发建表)

scala

// 创建空 DataFrame

val emptyDF = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schema)

// 写入 MySQL 表(若表不存在则自动创建)

emptyDF.write.format("jdbc")

  .option("url", "jdbc:mysql://localhost:3306/test_db") // 指定数据库

  .option("dbtable", "users") // 表名

  .option("user", "root")

  .option("password", "your_password")

  .option("driver", "com.mysql.cj.jdbc.Driver")

  .mode("overwrite") // 覆盖模式(可根据需求改为 append/ignore)

  .save()

 

关键参数说明

-  dbtable :需指定 完整表名(如  test_db.users ,若已指定数据库可省略前缀)。

- 表结构需与 MySQL 数据类型匹配(如  StringType  →  VARCHAR , IntegerType  →  INT )。

 

四、验证表是否创建成功

1. 通过 SparkSQL 查询表结构

scala

spark.read.jdbc(

  "jdbc:mysql://localhost:3306/test_db",

  "users",

  Map("user" -> "root", "password" -> "your_password", "driver" -> "com.mysql.cj.jdbc.Driver")

).printSchema()

 

2. 直接登录 MySQL 查看

bash

mysql -uroot -p

USE test_db;

SHOW TABLES;

DESCRIBE users;

 

注意事项

1. 驱动版本匹配

- MySQL 8.0+ 需使用  mysql-connector-java-8.0+ ,低版本数据库需对应低版本驱动。

2. 权限问题

- 确保 MySQL 用户有创建数据库和表的权限(如  GRANT CREATE ON test_db.* TO 'user'@'localhost'; )。

3. 数据类型映射

- Spark 与 MySQL 数据类型需手动映射(例如  TimestampType  →  DATETIME ),避免自动创建表时类型错误。

假设我们有一个名为crops的数据库,包含以下字段: - crop_id: 作物ID - crop_name: 作物名称 - yield: 产量 - price: 价格 - timestamp: 时间戳 我们可以使用Spark SQLStreaming来处理查询这个数据,具体步骤如下: 1. 创建SparkSession对象,并配置Spark Streaming上下文: ```python from pyspark.sql import SparkSession from pyspark.streaming import StreamingContext spark = SparkSession.builder.appName("CropsAnalysis").getOrCreate() ssc = StreamingContext(spark.sparkContext, batchDuration=1) ``` 2. 从数据库中读取crops数据创建一个DataFrame: ```python crops_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/mydatabase").option("dbtable", "crops").option("user", "myusername").option("password", "mypassword").load() ``` 3. 使用Spark SQL进行数据查询: ```python crops_df.createOrReplaceTempView("crops_view") # 查询产量最高的作物 yield_max = spark.sql("SELECT crop_name, MAX(yield) AS max_yield FROM crops_view GROUP BY crop_name ORDER BY max_yield DESC") yield_max.show() # 查询价格最高的作物 price_max = spark.sql("SELECT crop_name, MAX(price) AS max_price FROM crops_view GROUP BY crop_name ORDER BY max_price DESC") price_max.show() ``` 4. 使用Spark Streaming实时处理数据: ```python # 定义数据流 stream = ssc.socketTextStream("localhost", 9999) # 将数据流转换为DataFrame fields = ["crop_id", "crop_name", "yield", "price", "timestamp"] lines = stream.map(lambda x: x.split(",")) crops_stream_df = lines.map(lambda x: (int(x[0]), x[1], float(x[2]), float(x[3]), int(x[4]))).toDF(fields) # 将实时数据插入到数据库中 crops_stream_df.write.format("jdbc").option("url", "jdbc:mysql://localhost:3306/mydatabase").option("dbtable", "crops").option("user", "myusername").option("password", "mypassword").mode("append").save() # 查询实时数据 crops_stream_df.createOrReplaceTempView("crops_stream_view") stream_yield_max = spark.sql("SELECT crop_name, MAX(yield) AS max_yield FROM crops_stream_view GROUP BY crop_name ORDER BY max_yield DESC") stream_yield_max.writeStream.format("console").outputMode("complete").start() ``` 以上代码是一个简单的示例,可以根据具体需求进行修改扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值