大数据-SparkSQL(四)
Sparksql 操作hivesql
添加依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.3.3</version>
</dependency>
代码开发
package com.kaikeba.sql
import org.apache.spark.sql.SparkSession
//todo:利用sparksql操作hivesql
object HiveSupport {
def main(args: Array[String]): Unit = {
//1、构建SparkSession对象
val spark: SparkSession = SparkSession.builder()
.appName("HiveSupport")
.master("local[2]")
.enableHiveSupport() //开启对hive的支持
.getOrCreate()
//2、直接使用sparkSession去操作hivesql语句
//2.1 创建一张hive表
spark.sql("create table people(id string,name string,age int) row format delimited fields terminated by ','")
//2.2 加载数据到hive表中
spark.sql("load data local inpath './data/kaikeba.txt' into table people ")
//2.3 查询
spark.sql("select * from people").show()
spark.stop()
}
}
JDBC数据源
spark sql可以通过 JDBC 从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中。
- 通过sparksql加载mysql表中的数据
添加mysql连接驱动jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
代码开发
package com.kaikeba.sql
import java.util.Properties
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
//todo:利用sparksql加载mysql表中的数据
object DataFromMysql {
def main(args: Array[String]): Unit = {
//1、创建SparkConf对象
val sparkConf: SparkConf = new SparkConf().setAppName("DataFromMysql").setMaster("local[2]")
//2、创建SparkSession对象
val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
//3、读取mysql表的数据
//3.1 指定mysql连接地址
val url="jdbc:mysql://node03:3306/spark"
//3.2 指定要加载的表名
val tableName="user"
// 3.3 配置连接数据库的相关属性
val properties = new Properties()
//用户名
properties.setProperty("user","root")
//密码
properties.setProperty("password","123456")
val mysqlDF: DataFrame = spark.read.jdbc(url,tableName,properties)
//打印schema信息
mysqlDF.printSchema()
//展示数据
mysqlDF.show()
//把dataFrame注册成表
mysqlDF.createTempView("user")
spark.sql("select * from user where age >30").show()
spark.stop()
}
}
- 通过sparksql保存结果数据到mysql表中
代码开发(本地运行)
package com.kaikeba.sql
import java.util.Properties
import org.apache.spark.sql.{DataFrame, SparkSession}
//todo:通过sparksql把结果数据写入到mysql表中
object Data2Mysql {
def main(args: Array[String]): Unit = {
//1、创建SparkSession
val spark: SparkSession = SparkSession
.builder()
.appName("Data2Mysql")
.master("local[2]")
.getOrCreate()
//2、读取mysql表中数据
//2.1 定义url连接
val url="jdbc:mysql://node03:3306/spark"
//2.2 定义表名
val table="user"
//2.3 定义属性
val properties=new Properties()
properties.setProperty("user","root")
properties.setProperty("password","123456")
val mysqlDF: DataFrame = spark.read.jdbc(url,table,properties)
//把dataFrame注册成一张表
mysqlDF.createTempView("user")
//通过sparkSession调用sql方法
//需要统计经度和维度出现的人口总数大于1000的记录 保存到mysql表中
val result: DataFrame = spark.sql("select * from user where age > 30")
//保存结果数据到mysql表中
//mode:指定数据的插入模式
//overwrite: 表示覆盖,如果表不存在,事先帮我们创建
//append :表示追加, 如果表不存在,事先帮我们创建
//ignore :表示忽略,如果表事先存在,就不进行任何操作
//error :如果表事先存在就报错(默认选项)
result.write.mode("append").jdbc(url,"kaikeba",properties)
// result.write.mode(args(0)).jdbc(url,args(1),properties)
//关闭
spark.stop()
}
}
打成jar包集群提交
代码开发
package com.kaikeba.sql
import java.util.Properties
import org.apache.spark.sql.{DataFrame, SparkSession}
//todo:通过sparksql把结果数据写入到mysql表中
object Data2Mysql {
def main(args: Array[String]): Unit = {
//1、创建SparkSession
val spark: SparkSession = SparkSession
.builder()
.appName("Data2Mysql")
.getOrCreate()
//2、读取mysql表中数据
//2.1 定义url连接
val url="jdbc:mysql://node03:3306/spark"
//2.2 定义表名
val table="user"
//2.3 定义属性
val properties=new Properties()
properties.setProperty("user","root")
properties.setProperty("password","123456")
val mysqlDF: DataFrame = spark.read.jdbc(url,table,properties)
//把dataFrame注册成一张表
mysqlDF.createTempView("user")
//通过sparkSession调用sql方法
//把年龄大于30的用户信息保存到mysql表中
val result: DataFrame = spark.sql("select * from user where age >30")
//保存结果数据到mysql表中
//mode:指定数据的插入模式
//overwrite: 表示覆盖,如果表不存在,事先帮我们创建
//append :表示追加, 如果表不存在,事先帮我们创建
//ignore :表示忽略,如果表事先存在,就不进行任何操作
//error :如果表事先存在就报错(默认选项)
result.write.mode(args(0)).jdbc(url,args(1),properties)
//关闭
spark.stop()
}
}
提交任务脚本
spark-submit \
--master spark://node01:7077 \
--class com.kaikeba.sql.Data2Mysql \
--executor-memory 1g \
--total-executor-cores 4 \
--driver-class-path /home/hadoop/jars/mysql-connector-java-5.1.38.jar \
--jars /home/hadoop/jars/mysql-connector-java-5.1.38.jar \
original-spark_class05-1.0-SNAPSHOT.jar \
append t_kaikeba
--driver-class-path:指定一个Driver端所需要的额外jar
--jars :指定executor端所需要的额外jar
sparksql保存数据操作
代码开发
package com.kaikeba.sql
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
//todo:sparksql可以把结果数据保存到不同的外部存储介质中
object SaveResult {
def main(args: Array[String]): Unit = {
//1、创建SparkConf对象
val sparkConf: SparkConf = new SparkConf().setAppName("SaveResult").setMaster("local[2]")
//2、创建SparkSession对象
val spark: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
//3、加载数据源
val jsonDF: DataFrame = spark.read.json("E:\\data\\score.json")
//4、把DataFrame注册成表
jsonDF.createTempView("t_score")
//todo:5、统计分析
val result: DataFrame = spark.sql("select * from t_score where score > 80")
//保存结果数据到不同的外部存储介质中
//todo: 5.1 保存结果数据到文本文件 ---- 保存数据成文本文件目前只支持单个字段,不支持多个字段
result.select("name").write.text("./data/result/123.txt")
//todo: 5.2 保存结果数据到json文件
result.write.json("./data/json")
//todo: 5.3 保存结果数据到parquet文件
result.write.parquet("./data/parquet")
//todo: 5.4 save方法保存结果数据,默认的数据格式就是parquet
result.write.save("./data/save")
//todo: 5.5 保存结果数据到csv文件
result.write.csv("./data/csv")
//todo: 5.6 保存结果数据到表中
result.write.saveAsTable("t1")
//todo: 5.7 按照单个字段进行分区 分目录进行存储
result.write.partitionBy("classNum").json("./data/partitions")
//todo: 5.8 按照多个字段进行分区 分目录进行存储
result.write.partitionBy("classNum","name").json("./data/numPartitions")
spark.stop()
}
}
此博文仅供学习参考,如有错误欢迎指正。
上一篇《大数据-SparkSQL(三)》
下一篇《大数据-SparkSQL(五)》