3.sparkSQL整合Hive
spark SQL经常需要访问Hive metastore,Spark SQL可以通过Hive metastore获取Hive表的元数据。从Spark 1.4.0开始,Spark SQL只需简单的配置,就支持各版本Hive metastore的访问。注意,涉及到metastore时Spar SQL忽略了Hive的版本。Spark SQL内部将Hive反编译至Hive 1.2.1版本,Spark SQL的内部操作(serdes, UDFs, UDAFs, etc)都调用Hive 1.2.1版本的class。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | < configuration > < property > < name >javax.jdo.option.ConnectionURL</ name > < value >jdbc:mysql://192.168.19.131:3306/hivedb?createDatabaseIfNotExist=true</ value > </ property > < property > < name >javax.jdo.option.ConnectionDriverName</ name > < value >com.mysql.jdbc.Driver</ value > </ property > < property > < name >javax.jdo.option.ConnectionUserName</ name > < value >root</ value > </ property > < property > < name >javax.jdo.option.ConnectionPassword</ name > < value >hadoop</ value > </ property > </ configuration > |
1 2 3 4 5 | bin/spark-shell \ --master spark://intsmaze:7077 \ --executor-memory 512m \ --total-executor-cores 2\ --driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar |
sprk on yarn模式
1 2 3 4 5 | bin/spark-shell \ --master yarn \ --executor-memory 512m \ --total-executor-cores 2\ --driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar |
1 2 | val rdd=sqlContext.sql( "select * from default.person limit 2" ) //现在就可以直接使用sql语句了,只是要指定查询哪个库的哪张表。 rdd.write.json( "hdfs://192.168.19.131:9000/personresult" ) |
1 2 3 | import org.apache.spark.sql.hive.HiveContext val hiveContext = new HiveContext(sc) hiveContext.sql( "select * from default.person " ) |
启动spark-sql时指定mysql连接驱动位置(启动spark-sql那么就和hive的操作一样,里面可以直接写sql语句进行操作)
1 2 3 4 5 | bin/spark-sql\ --master spark://intsmaze:7077 \ --executor-memory 512m \ --total-executor-cores 3 \ --driver-class-path /home/intsmaze/mysql-connector-java-5.1.35-bin.jar |
1 | 里面直接写sql语句。 |
1 | select * from default .person limit 2 |
第一种是在${SPARK_HOME}/conf目录下的spark-defaults.conf中添加:spark.jars /intsmaze/lib/mysql-connector-java-5.1.26-bin.jar。
第二种是通过添加 :spark.driver.extraClassPath /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar这种方式也可以实现添加多个依赖jar,比较方便。
第三种是在运行时添加 --jars /intsmaze/lib2/mysql-connector-java-5.1.26-bin.jar。
启动thrift
在spark根目录下执行:./sbin/start-thriftserver.sh 开启thrift服务器。
1 | ./start-thriftserver.sh --jars /home/hadoop/mysql-connector-java-5.1.35-bin.jar --master yarn |
start-thriftserver.sh 和spark-submit的用法类似,可以接受所有spark-submit的参数,并且还可以接受--hiveconf 参数。不添加任何参数表示以local方式运行,默认的监听端口为10000
用beeline测试

在java代码中用jdbc连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | < dependency > < groupId >org.apache.hive</ groupId > < artifactId >hive-jdbc</ artifactId > < version >1.2.1</ version > </ dependency > < dependency > < groupId >org.apache.hadoop</ groupId > < artifactId >hadoop-common</ artifactId > < version >2.4.1</ version > </ dependency > < dependency > < groupId >jdk.tools</ groupId > < artifactId >jdk.tools</ artifactId > < version >1.6</ version > < scope >system</ scope > < systemPath >${JAVA_HOME}/lib/tools.jar</ systemPath > </ dependency > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Test1 { public static void main(String[] args) throws SQLException { String url = "jdbc:hive2://192.168.19.131:10000/default" ; try { Class.forName( "org.apache.hive.jdbc.HiveDriver" ); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection conn = DriverManager.getConnection(url, "hadoop" , "" ); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM personlimit 10" ; ResultSet res = stmt.executeQuery(sql); while (res.next()){ System.out.println( "id: " +res.getInt( 1 )+ "\tname: " +res.getString( 2 )+ "\tage:" + res.getInt( 3 )); } } } |
这种方式,可以在yarn的管理界面看到,会长起一个任务,该任务负责跑sql语句,但是不能并行跑sql语句,就是同时为两个用户输入的查询语句同时跑,必须等一个跑完了再跑第二个。
spark sql可视化
第一种方案:
将spark sql代码打包,sql语句和结果存储位置作为参数,java代码收集这些参数后,组装为命令,调用脚本来向集群提交jar包。
第二种方案:
根据Spark官网所述,Spark SQL实现了Thrift JDBC/ODBC server
最后,这篇文章很久了,一直编辑没有发布,我现在已经一年不搞spark了,专注java核心技术的研究。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?