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

以下是使用 Spark SQL 在 MySQL 中创建数据库和表的步骤(基于 Scala API):

 

1. 准备工作

 

- 添加 MySQL 驱动依赖

同前所述,需在 Spark 环境中引入 MySQL Connector JAR 包(如  mysql-connector-java-8.0.33.jar )。

 

- 获取 SparkSession

scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()

  .appName("Spark SQL MySQL")

  .master("local[*]") // 或集群地址

  .getOrCreate()

 

 

2. 创建 MySQL 数据库

 

方式 1:通过原生 SQL 语句创建

 

scala

// 构建 MySQL 连接参数

val jdbcUrl = "jdbc:mysql://localhost:3306/?useSSL=false&useUnicode=true&characterEncoding=utf8" // 未指定数据库名

val user = "root"

val password = "your_password"

 

// 使用 Spark SQL 执行原生 MySQL 语句(需通过 JDBC 提交)

spark.sql(s"""

  CREATE TABLE jdbc($jdbcUrl) 

  (statement 'CREATE DATABASE IF NOT EXISTS test_db')

""").show()

 

 

方式 2:通过 DataFrameWriter 间接创建(需先连接空数据库)

 

scala

// 连接到 MySQL 服务器(未指定数据库)

val emptyDbUrl = "jdbc:mysql://localhost:3306/?useSSL=false"

val createDbDf = spark.createDataFrame(Seq.empty[(String)]) // 空 DataFrame

 

createDbDf.write.format("jdbc")

  .option("url", emptyDbUrl)

  .option("dbtable", "(CREATE DATABASE IF NOT EXISTS test_db) AS dummy") // 执行建库语句

  .option("user", user)

  .option("password", password)

  .mode("append")

  .save()

 

 

3. 创建 MySQL 表

 

步骤 1:连接到目标数据库

 

scala

val dbUrl = "jdbc:mysql://localhost:3306/test_db?useSSL=false&characterEncoding=utf8"

 

 

步骤 2:定义表结构并创建表

 

方式 1:通过 Spark SQL 建表语句(DDL)

 

scala

// 定义表结构(DDL 语法需符合 MySQL 规范)

val createTableSql = """

  CREATE TABLE IF NOT EXISTS users (

    id INT PRIMARY KEY AUTO_INCREMENT,

    name VARCHAR(50) NOT NULL,

    age INT,

    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

"""

 

// 执行建表语句(通过 JDBC 提交)

spark.sql(s"""

  CREATE TABLE jdbc($dbUrl) 

  (statement '$createTableSql')

""").show()

 

 

方式 2:通过 DataFrame 模式推断创建表

 

scala

// 创建示例 DataFrame(定义表结构)

val data = Seq(

  (1, "Alice", 25),

  (2, "Bob", 30)

)

val schema = "id INT, name STRING, age INT"

val df = spark.createDataFrame(data, schema)

 

// 写入空表(自动创建表结构)

df.write.format("jdbc")

  .option("url", dbUrl)

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

  .option("user", user)

  .option("password", password)

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

  .mode("overwrite") // 若表不存在则创建,存在则覆盖

  .save()

 

 

关键说明

 

1. 建库建表权限:需确保 MySQL 用户(如  root )具备  CREATE DATABASE  和  CREATE TABLE  权限。

 

2. DDL 语法兼容性:Spark SQL 通过 JDBC 执行的是 原生 MySQL 语句,需遵循 MySQL 的语法规则(如引擎、字符集设置)。

 

3. 表已存在处理:使用  CREATE TABLE IF NOT EXISTS  避免重复建表报错。

 

通过以上方法,可利用 Spark SQL 在 MySQL 中完成数据库和表的创建操作。

假设我们有一个名为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、付费专栏及课程。

余额充值