以前的老版本1.0开始出现SparkSQL,在官网显示只有SparkSQL一个,1.3毕业;现在的官网显示:SQL,DataFrames,and Datasets,也就说1.0版本只有一个框架,就是SparkSQL,现在有SQL,DataFrames,Datasets三个框架。
特性:官网 http://spark.apache.org/sql/
官网:http://spark.apache.org/docs/2.4.2/sql-programming-guide.html
Spark SQL是一个用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了关于数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用这些信息来执行优化。有几种与Spark SQL交互的方法,包括SQL和Dataset API。当计算结果时,使用相同的执行引擎,而不依赖于使用哪种API/语言来表示计算。
Spark SQL的一个用途是执行SQL查询。
Spark SQL还可以用于从现有Hive安装中读取数据。
当在另一种编程语言中运行SQL时,结果将作为Dataset/DataFrame返回。您还可以使用命令行或JDBC/ODBC与SQL接口进行交互。
Dataset 是分布式的数据集合。Dataset是Spark 1.6中添加的一个新接口,它提供了RDDs(强类型,能够使用强大的lambda函数)的优点,以及Spark SQL优化执行引擎的优点。可以从JVM对象构造数据集,然后使用功能转换(map、flatMap、filter等)操作数据集。Dataset API在Scala和Java中可用。Python不支持Dataset API。
DataFrame是组织成命名列的数据集。是在Spark 1.3中出现的,它在概念上等价于关系数据库中的表或R/Python中的数据框架,但在底层有更丰富的优化。DataFrames 可以由一系列广泛的源构建,例如:结构化数据文件、Hive中的表、外部数据库或现有的RDDs。DataFrame API可在Scala、Java、Python和R中使用。在Scala和Java中,DataFrame 表示一个Rows的Dataset。在Scala API中,DataFrame只是Dataset[Row]的一个类型别名。而在Java API中,用户需要使用Dataset来表示DataFrame。
[hadoop@vm01 conf]$ cp ~/app/hive-1.1.0-cdh5.7.0/conf/hive-site.xml ./
访问之前,先在Hive里面创建一张worker表,因为我的Hive里面一张表都没有,如果你的Hive里面有其他表,这一步略。创建的表如果没有指定路径,那么默认是放在HDFS的/user/hive/warehouse
目录
[hadoop@vm01 ~]$ hive
hive>
> create table worker (id string,salary double,bon double,dep int);
OK
Time taken: 0.744 seconds
hive>
> select * from worker;
OK
Time taken: 0.494 seconds
[hadoop@vm01 conf]$ hdfs dfs -ls /user/hive/warehouse
drwxr-xr-x - hadoop supergroup 0 2019-08-05 19:15 /user/hive/warehouse/worker
第一种:spark-shell
[hadoop@vm01 bin]$ ./spark-shell \
--jars /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.2
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45)
Type in expressions to have them evaluated.
Type :help for more information.
scala> spark.sql("show tables").show(false)
拉到最后可以看到添加了jar包信息。
spark://vm01:36873/jars/mysql-connector-java-5.1.47.jar --> Added By User
第二种:spark-sql
库名默认是default库
[hadoop@vm01 bin]$ ./spark-sql \
> --jars /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar \
> --driver-class-path /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
Spark master: local[*], Application Id: local-1565050701376
spark-sql> show tables;
第三种:开启thriftserver,这个在编译的时候需要指定
[hadoop@vm01 sbin]$ ./start-thriftserver.sh \
--jars /home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
打开beeline客户端,如果这里没有./
也有可能是开启的hive里面的beeline,因为hive配置了环境变量。
[hadoop@vm01 bin]$ ./beeline -u jdbc:hive2://localhost:10000 -n hadoop
Connecting to jdbc:hive2://localhost:10000
Connected to: Spark SQL (version 2.4.2)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.1.spark2 by Apache Hive
0: jdbc:hive2://localhost:10000> show tables;
SparkSession是SparkSQL的入口,相当于SparkCore的SparkContext的入口。
IDEA开发,首先添加SparkSQL依赖.。
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-sql_2.11artifactId>
<version>${spark.version}version>
dependency>
package com.ruozedata.spark
import org.apache.spark.sql.SparkSession
object SparkSessionApp {
def main(args: Array[String]): Unit = {
val spark=SparkSession.builder()
.master("local[2]")
.appName("SparkSeesionApp")
.enableHiveSupport() //支持hive
.getOrCreate()
spark.sql("show tables").show(false)
spark.stop()
}
}