SQLContext的使用
创建一个Scala项目,创建一个主类SQLContextApp
package com.yy.spark
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
/**
* SQLContext的使用
* Spark 1.x使用
*/
object SQLContextApp extends App {
var path = args(0)
//创建相应的Context
val sparkConf = new SparkConf()
//在测试或者生产中,AppName和Master通过脚本进行指定,本地开发环境可以如下写法
//sparkConf.setAppName("SQLContextApp").setMaster("local[2]")
val sparkContext = new SparkContext()
val sqlContext = new SQLContext(sparkContext)
//2)相关处理
val people = sqlContext.read.format("json").load(path)
people.printSchema()
people.show()
//3)关闭资源
sparkContext.stop()
}
提交Spark Application到环境中运行
在服务器执行以下命令
$ spark-submit \
--class com.yy.spark.SQLContextApp \
--master local[2] \
/home/hadoop/lib/sparksql-project-1.0.jar \
/home/hadoop/app/spark-2.2.0-bin-hadoop2.6/examples/src/main/resources/people.json
通过shell脚本执行
1) 创建shell文件,将刚才执行的语句粘贴到sqlcontext.sh文件
$ vim sqlcontext.sh
spark-submit \
--name SQLContextApp \
--class com.yy.spark.SQLContextApp \
--master local[2] \
/home/hadoop/lib/sparksql-project-1.0.jar \
/home/hadoop/app/spark-2.2.0-bin-hadoop2.6/examples/src/main/resources/people.json
2) 赋予权限
$ chmod u+x sqlcontext.sh
3) 执行
$ ./sqlcontext.sh
HiveCntext的使用
使用HiveContext
,不需要一个已经安装好的Hive环境。只需要hive-site.xml
将hive目录下conf文件夹下的hive-site.xml复制到spark的conf目录
$ cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf
创建HiveContextApp,代码如下
package com.yy.spark
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}
/**
* HiveContext的使用
* Spark 1.x使用
*/
object HiveContextApp extends App {
//创建相应的Context
val sparkConf = new SparkConf()
val sparkContext = new SparkContext()
val hiveContext = new HiveContext(sparkContext)
//2)相关处理
hiveContext.table("emp").show()
//3)关闭资源
sparkContext.stop()
}
在项目根目录使用maven编译
mvn package -Dmaven.test.skip=true
编译完将项目target目录下jar包上传到服务器lib目录下,我编译的文件是sparksql-project-1.0.jar
将mysql工具包mysql-connector-java-5.1.45.jar上传到software目录下
编辑hivecontext.sh脚本
$ vim hivecontext.sh
spark-submit \
--class com.yy.spark.HiveContextApp \
--master local[2] \
--jars /home/hadoop/software/mysql-connector-java-5.1.45.jar \
/home/hadoop/lib/sparksql-project-1.0.jar
赋予权限,执行脚本
$ chmod u+x sqlcontext.sh
$ ./hivecontext.sh
SparkSession的使用
这里以读取hive为例
将hive目录下conf文件夹下的hive-site.xml复制到spark的conf目录
$ cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf
创建SparkSessionApp,代码如下
package com.yy.spark
import org.apache.spark.sql.SparkSession
/**
* SparkSession使用
* Spark 2.x
*/
object SparkSessionApp extends App {
//读取本地文件
// var path = args(0)
// val spark = SparkSession.builder().appName("SparkSessionApp").master("local[2]").getOrCreate()
// val people = spark.read.json(path)
// people.show()
// spark.stop()
//读取Hive
val sparkHive = SparkSession.builder().appName("HiveSparkSessionApp").master("local[2]").enableHiveSupport().getOrCreate()
//加载hive表
val emp = sparkHive.table("emp")
emp.show()
//关闭
sparkHive.stop()
}
在项目根目录使用maven编译
mvn package -Dmaven.test.skip=true
编译完将项目target目录下jar包上传到服务器lib目录下,我编译的文件是sparksql-project-1.0.jar
将mysql工具包mysql-connector-java-5.1.45.jar上传到software目录下
编辑hivecontext.sh脚本
$ vim hivecontext.sh
spark-submit \
--class com.yy.spark.SparkSessionApp \
--master local[2] \
--jars /home/hadoop/software/mysql-connector-java-5.1.45.jar \
/home/hadoop/lib/sparksql-project-1.0.jar
赋予权限,执行脚本
$ chmod u+x sqlcontext.sh
$ ./hivecontext.sh
spark-shell & spark-sql的使用
如果使用hive,前提也需要把hive-site.xml复制到spark的conf目录
cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf
spark-shell
$ ./spark-shell --master local[2] --jars ~/software/mysql-connector-java-5.1.45.jar
# 查看hive中所有表
scala> spark.sql("show tables").show
+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
| default| emp| false|
+--------+---------+-----------+
# 查看emp表数据
scala> spark.sql("select * from emp").show
spark-sql
使用spark-sql可以直接在控制台写sql语句
$ ./spark-sql --master local[2] --jars ~/software/mysql-connector-java-5.1.45.jar
# 查看hive中所有表
spark-sql> show tables;
# 查看emp表数据
spark-sql> select * from emp;
thriftserver & beeline的使用
启动thriftserver,
$ cd $SPARK_HOME/sbin
$ ./start-thriftserver.sh --master local[2] --jars ~/software/mysql-connector-java-5.1.45.jar
默认端口10000,可以通过指定参数修改
./sbin/start-thriftserver.sh \
--master local[2] \
--jars ~/software/mysql-connector-java-5.1.45.jar \
--hiveconf hive.server2.thrift.port=14000
启动 beeline,-u是指thriftserver地址,-n是服务器用户名
$ cd $SPARK_HOME/bin
$ ./beeline -u jdbc:hive2://localhost:10000 -n hadoop
0: jdbc:hive2://localhost:10000> show tables;
0: jdbc:hive2://localhost:10000> select * from emp;
thriftserver和spark-shell/spark-sql的区别
1) spark-shell、spark-sql,每启动一个都是一个spark application
2)thriftserver,不管启动多少个客户端(beeline/code),都是一个spark application,申请资源的时候只需启动server时申请一次;解决了数据共享问题,多个客户端可以共享数据;
jdbc方式编程访问
在使用jdbc开发时,要先启动thriftserver
在pom.xml中引入依赖
<dependency>
<groupId>org.spark-project.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1.spark2</version>
</dependency>
jdbc方式访问代码如下
package com.yy.spark
import java.sql.DriverManager
/**
* 通过JDBC访问
*/
object SparkSQLThriftServerApp extends App {
Class.forName("org.apache.hive.jdbc.HiveDriver")
val conn = DriverManager.getConnection("jdbc:hive2://hadoop000:10000", "hadoop", "")
val pstmt = conn.prepareStatement("select empno,ename,salary from emp")
val rs = pstmt.executeQuery()
while (rs.next()) {
println("empno:" + rs.getInt("empno") + ", ename:"+rs.getString("ename")
+ ", salary:"+rs.getDouble("salary"))
}
rs.close()
pstmt.close()
conn.close()
}