SparkSQL,通俗来讲就是将DataFrame构建一张临时表,然后去用sql语言查询这张临时表
DF.createOrReplaceTempView("XX表名")
spark.sql("select * from XX表名").show
与Hive将HQL转化成MapReduce然后提交到集群中执行类似,SparkSQL是转化成了RDD,提交到集群中用Spark来执行。Spark的运算效率比MR要快很多。
并且SparkSQL兼容Hive与JDBC;SparkSQL提供的两个抽象编程模块:DataFrame和DataSet。
SparkSQL的DataFrame接口支持多种数据源的操作,下面整理一下SparkSQL常用三种数据源的load加载与save保存语法。
目录
2. 创建完DataFrame后,使用SparkSQL执行sql查询语句,两种方式
一、本地 & HDFS
SparkSQL中默认数据源是parquet格式,两种数据来源
file:/path
hdfs://hadoop100:9000:/path
1. 加载DataFrame语法
(1)加载默认格式parquet
spark.read.load("file:/opt/module/data.parquet")
(2)加载json格式
方法一:
spark.read.json("hdfs://hadoop100:9000/data/1.json")
方法二:
spark.read.format("json").load("hdfs://hadoop100:9000/data/1.json")
2. 创建完DataFrame后,使用SparkSQL执行sql查询语句,两种方式
(1)基础查询方式
DF.createOrReplaceTempView("XX表名")
spark.sql("select * from XX表名").show
(2)优化查询方式
spark.sql("select * from json.`file:/opt/module/2.json`").show
spark.sql("select * from parquet.`hdfs://hadoop102:9000/2.parquet`").show
3. 数据保存
完整语法:DF.write.format("~").mode("overwrite / append / ignore / errorifexists").save("~")
(1)输出文件夹output若存在,会报错
1. 默认保存格式parquet,压缩方式snappy
DF.write.save("file:/output")
2. 指定保存为.json格式文件
DF.write.format("json").save("file:/output")
(2)覆盖output文件夹的文件
DF.write.format("json").mode("overwrite").save("file:/output")
(3)追加到output文件夹的文件
DF.write.format("json").mode("append").save("file:/output")
二、JDBC数据源
SparkSQL可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,也可以将DataFrame通过一系列计算后,将数据写回关系型数据库中。
但是首先要将相关的数据库驱动放到spark安装目录下的/jars目录中。
mysql-connector-java-5.1.27-bin.jar.zip
1. 从mysql中加载数据
val prop = new java.util.Properties()
prop.put("user","root")
prop.put("password","000000")
eg:获取mysql中company库,stuff表的数据,将表中数据变成DataFrame
scala> val jdbcDF = spark.read.jdbc("jdbc:mysql://hadoop100:3306/company","staff",prop)
jdbcDF: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]
scala> jdbcDF.show
+---+-----+----+
| id| name| sex|
+---+-----+----+
| 1|Kevin|Male|
| 2| John|Male|
+---+-----+----+
2. 将数据写入mysql
这里savemode用追加append
scala> jdbcDF.write.mode("append").jdbc("jdbc:mysql://hadoop100:3306/company","staff",prop)
三、Hive数据库
Spark本身拥有自带的内嵌Hive功能模块,使用外部Hive功能时,需要进行以下操作把内嵌的Hive删掉;这样就可以直接直接操作hive表,与hive将HQL转化为MapReduce不同,Spark中支持hive在Spark引擎中计算,速度更快。
[kevin@hadoop100 spark]$ rm -rf derby.log
[kevin@hadoop100 spark]$ rm -rf metastore_db/
[kevin@hadoop100 spark]$ rm -rf spark-warehouse/
[kevin@hadoop100 spark]$ cp /opt/module/hive/conf/hive-site.xml ./conf/
1. 启动Spark-shell使用hive
spark/bin/spark-shell启动
spark.sql("HQL语句").show
2. 直接启动Spark-sql使用hive
spark/bin/spark-sql启动
spark-sql (default)>
剩余操作与hive一致
3. 代码中使用hive
添加依赖
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>