官网概述:
Spark SQL is Apache Spark’s module for working with structured data.
Spark SQL是Apache Spark处理结构化数据的模块。Spark SQL不仅仅有访问和操作SQL的功能,还提供了其他的非常丰富的操作:外部数据源,优化。
Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用此额外信息来执行额外的优化。有几种与Spark SQL交互的方法,包括SQL和Dataset API。在计算结果时,使用相同的执行引擎,与您用于表达计算的API /语言无关。这种统一意味着开发人员可以轻松地在不同的API之间来回切换,从而提供表达给定转换的最自然的方式。
所有的在这个页使用的样本数据的示例中包括在所述火花分布,并且可以在运行spark-shell,pyspark壳,或sparkR外壳。
Spark SQL的前世今生:
spark sql官网介绍:
Spark SQL架构
SQLContext/HiveContext/SparkSession使用
1.Spark1.X中Spark SQL的入口点:SQLContext
json文件:
{"name":"zhangsan"}
{"name":"Lisi","age":20}
{"name":"wangwu","age":22}
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
/**
* SQLContext的使用:
*/
object SQLContextApp {
def main(args: Array[String]) {
val path = args(0)
//1)创建相应的Context
val sparkConf = new SparkConf()
//在测试或者生产中,AppName和Master我们是通过脚本进行指定
//sparkConf.setAppName("SQLContextApp").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sc)
//2)相关的处理: json
val people = sqlContext.read.format("json").load(path)
people.printSchema()
people.show()
//3)关闭资源
sc.stop()
}
}
提交spark Application到环境中运行
spark-submit --class cnn.spark.SQLContextApp --master local[2] /home/hadoop/lib/sql-1.0.jar /home/hadoop/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/example/src/main/resources/people.json
2.Spark1.X中Spark SQL的入口点:HiveContext
//sc is an existing SparkContext
val sqlContext =new org.apache.spark.sql.hive.HiveContext(sc)
HiveContext并不需要Hive环境:
1.to use a HiveContext,you do not need to have an existing Hive setup
2.有hive-site.xml
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}
/**
* HiveContext的使用
* 使用时需要通过--jars 把mysql的驱动传递到classpath
*/
object HiveContextApp {
def main(args: Array[String]) {
//1)创建相应的Context
val sparkConf = new SparkConf()
//在测试或者生产中,AppName和Master我们是通过脚本进行指定
//sparkConf.setAppName("HiveContextApp").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
val hiveContext = new HiveContext(sc)
//2)相关的处理:
hiveContext.table("emp").show
//3)关闭资源
sc.stop()
}
}
3.Spark2.X中Spark SQL的入口点:SparkSession
import org.apache.spark.sql.SparkSession
/**
* SparkSession的使用
*/
object SparkSessionApp {
def main(args: Array[String]) {
val spark = SparkSession.builder().appName("SparkSessionApp")
.master("local[2]").getOrCreate()
val people = spark.read.json("file:///Users/rocky/data/people.json")
people.show()
spark.stop()
}
}
thriftserver&beeline使用
1.启动thriftserver:
sbin/start-thriftserver.sh --master local[2] --jars ~/user/mysql-connector-java-5.1.27-bin.jar
2.启动beeline
beeline -u jdbc:hive2://localhost:10000 -n hadoop
修改thriftserver启动占用的默认的端口号(10000是默认的端口号):
sbin/start-thriftserver.sh --master local[2] --jars ~/user/mysql-connector-java-5.1.27-bin.jar --hiveconf hive.server2.thrift.port=13000
beeline也是需要修改的:
beeline -u jdbc:hive2://localhost:13000 -n hadoop
thriftserver和普通的spark-shell/spark-sql有什么区别?
1.spark-shell,spark-sql都是一个spark applicqtion;
2.thriftserver不管启动多少个客户端(beeline/code),永远都是一个spark application,解决了一个数据共享的问题,多个客户端可以共享数据
#jdbc方式编程访问
maven添加依赖:org.spark-project.hive#hive-jdbc
<dependency>
<groudID>org.spark-project.hive</groudID>
<artifactID>hive-jdbc</artifaceID>
<version>1.2.1.spark2</version>
</dependency>
import java.sql.DriverManager
/**
* 通过JDBC的方式访问
*/
object SparkSQLThriftServerApp {
def main(args: Array[String]) {
Class.forName("org.apache.hive.jdbc.HiveDriver")
val conn = DriverManager.getConnection("jdbc:hive2://hadoop01:13000","hadoop","")
val pstmt = conn.prepareStatement("select empno, ename, sal from emp")
val rs = pstmt.executeQuery()
while (rs.next()) {
println("empno:" + rs.getInt("empno") +
" , ename:" + rs.getString("ename") +
" , sal:" + rs.getDouble("sal"))
}
rs.close()
pstmt.close()
conn.close()
}
}
在使用jdbc开发时,一定要先启动thriftserver!