Spark SQL Hive数据源复杂综合案例实战
来源:互联网 发布:杜兰特对伦纳德数据 编辑:程序博客网 时间:2024/05/01 13:03
Spark SQL Hive数据源复杂综合案例实战(读写各种分区表)
Hive数据源来源
- Spark SQL除了支持SQLContext之外,还支持HIVESQL语法,利用HIVEContext来创建,HiveContext继承自SQLContext,但是增加了在Hive表中数据库中查找,同时也支持hql(方法)。Hiveql的功能要比sql的功能要强大很多。
- 使用HiveContext,可以执行Hive的大部分功能,包括创建表、往表里导入数据以及用SQL语句查询表中的数据。查询出来的数据是一个Row数组。
- 我们之前在将hive与spark集成的时候,讲过他们是如何集成的,大家在详细看看老师之前讲解的文档。
将hive-site.xml拷贝到spark/conf目录下,将mysql connector拷贝到spark/lib目录下
修改saprk-submit.sh
standalone 集群模式是 以这样的配置方式是可以的
/opt/spark/bin/spark-submit \--class $1 \--num-executors 1 \--driver-memory 1g \--executor-memory 1g \--executor-cores 2 \--files /opt/hive/conf/hive-site.xml \--driver-class-path /opt/hive/lib/mysql-connector-java-5.1.39.jar \/opt/jars/spark/spark-hive.jar\
将数据保存到Hive数据仓库中
- Spark SQL还允许将数据保存到Hive表中。调用DataFrame的saveAsTable命令,即可将DataFrame中的数据保存到Hive表中。
与registerTempTable区别,
saveAsTable是会将DataFrame中的数据物化到Hive表中的,而且还会在Hive元数据库中创建表的元数据。 - saveAsTable会创建一张Hive Managed Table,也就是说,数据的位置都是由元数据库中的信息控制的。当Managed Table被删除时,表中的数据也会一并被物理删除。
registerTempTable只是注册一个临时的表,只要Spark Application重启或者停止了,那么表就没了。而saveAsTable创建的是物化的表,无论Spark Application重启或者停止,表都会一直存在。 - 同时我们在调用HiveContext.table()方法,还可以直接针对Hive中的表,创建一个DataFrame方便我们以后进行操作。
代码案例 ##、
Scala 版本
/** * 关于Spark 和 Hive 的一个集成 */object SparkHiveOps extends App{ val conf = new SparkConf().setAppName("SparkHiveOps") val sc = new SparkContext(conf) val hiveContext = new HiveContext(sc) /** * 查询hvie中的数据 * */ val df = hiveContext.table("word"); df.show() /** * 向hive中写数据 * teacher_info * name,height * teacher_basic * name,age,married,children * 这是两张有关联的表,关联字段是name, * 需求: * teacher_info和teacher_basic做join操作,求出每个teacher的name,age,height,married,children * 要求height>180 */ //在hive中创建相应的表 hiveContext.sql("DROP TABLE IF EXISTS teacher_basic") hiveContext.sql("CREATE TABLE teacher_basic(" + "name string, " + "age int, " + "married boolean, " + "children int) " + "row format delimited " + "fields terminated by ','") //向teacher_basic表中加载数据 hiveContext.sql("LOAD DATA LOCAL INPATH '/opt/data/spark/teacher_basic.txt' INTO TABLE teacher_basic") //创建第二张表 hiveContext.sql("DROP TABLE IF EXISTS teacher_info") hiveContext.sql("CREATE TABLE teacher_info(name string, height int) row format delimited fields terminated by ','") hiveContext.sql("LOAD DATA LOCAL INPATH '/opt/data/spark/teacher_info.txt' INTO TABLE teacher_info") //执行多表关联 val joinDF = hiveContext.sql("select b.name, b.age, b.married, b.children, i.height from teacher_basic b left join teacher_info i on b.name = i.name where i.height > 180") hiveContext.sql("DROP TABLE IF EXISTS teacher") joinDF.show() joinDF.write.saveAsTable("teacher") sc.stop()}
Java版本
public class SparkHiveJava {public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName(SparkHiveJava.class.getSimpleName()); JavaSparkContext sc = new JavaSparkContext(conf); HiveContext hiveContext = new HiveContext(sc); //查询hvie 中的数据 DataFrame df = hiveContext.table("word"); df.show(); //向数据库中写数据 /** * 向hive中写数据 * teacher_info * name,height * teacher_basic * name,age,married,children * 这是两张有关联的表,关联字段是name, * 需求: * teacher_info和teacher_basic做join操作,求出每个teacher的name,age,height,married,children * 要求height>180 */ //在hive中创建相应的表 hiveContext.sql("DROP TABLE IF EXISTS teacher_basic"); hiveContext.sql("CREATE TABLE teacher_basic(" + "name string, " + "age int, " + "married boolean, " + "children int) " + "row format delimited " + "fields terminated by ','"); //向teacher_basic表中加载数据 hiveContext.sql("LOAD DATA LOCAL INPATH '/opt/data/spark/teacher_basic.txt' INTO TABLE teacher_basic"); //创建第二张表 hiveContext.sql("DROP TABLE IF EXISTS teacher_info"); hiveContext.sql("CREATE TABLE teacher_info(name string, height int) row format delimited fields terminated by ','"); hiveContext.sql("LOAD DATA LOCAL INPATH '/opt/data/spark/teacher_info.txt' INTO TABLE teacher_info"); //执行多表关联 DataFrame joinDF = hiveContext.sql("select b.name, b.age, b.married, b.children, i.height from teacher_basic b left join teacher_info i on b.name = i.name where i.height > 180"); hiveContext.sql("DROP TABLE IF EXISTS teacher"); joinDF.show(); joinDF.write().saveAsTable("teacher"); sc.stop();}
}
常见错误
O audit: ugi=kkk ip=unknown-ip-addr cmd=get_table : db=default tbl=word
这样写无法执行/opt/spark/bin/spark-submit \--class $1 \--master spark://master:7077 \--num-executors 1 \--driver-memory 1g \--executor-memory 1g \--executor-cores 2 \/opt/jars/spark/spark-hive.jar\
standalone 集群模式是 以这样的配置方式是可以的
/opt/spark/bin/spark-submit \--class $1 \--num-executors 1 \--driver-memory 1g \--executor-memory 1g \--executor-cores 2 \--files /opt/hive/conf/hive-site.xml \--driver-class-path /opt/hive/lib/mysql-connector-java-5.1.39.jar \/opt/jars/spark/spark-hive.jar\
/opt/spark/bin/spark-submit \--class $1 \--master yarn \--deploy-mode cluster \--num-executors 1 \--driver-memory 1g \--executor-memory 1g \--executor-cores 2 \--files /opt/hive/conf/hive-site.xml \--driver-class-path /opt/hive/lib/mysql-connector-java-5.1.39.jar \/opt/jars/spark/spark-hive.jar\目前yarn集群模式,搞不定呀
0 0
- Spark SQL Hive数据源复杂综合案例实战
- 8.Spark SQL:Hive数据源实战
- Spark SQL网站搜索综合案例实战
- Spark SQL基于网站Log的综合案例实战
- 第76课:Spark SQL基于网站Log的综合案例实战之Hive数据导入、Spark SQL对数据操作每天晚上20:00YY频道现场授课频道68917580
- 大数据IMF传奇行动绝密课程第69课:Spark SQL通过Hive数据源实战
- 大数据IMF传奇行动绝密课程第67课:spark SQL案例综合实战
- spark sql 使用hive作为数据源
- 9. Spark SQL:JDBC数据源实战
- 第69课:Spark SQL通过Hive数据源JOIN实战 每天晚上20:00YY频道现场授课频道68917580
- 第114课:SparkStreaming+Kafka+Spark SQL+TopN+Mysql+KafkaOffsetMonitor电商广告点击综合案例实战(详细内幕版本)
- 第114课(Scala版本)SparkStreaming+Kafka+Spark SQL+TopN+Mysql 电商广告点击综合案例实战
- 大数据IMF传奇行动绝密课程第75-79课:Spark SQL基于网站Log的综合案例实战
- 大数据IMF传奇行动绝密课程第80课:Spark SQL网站搜索综合案例实战
- 《Spark SQL大数据实例开发》9.2 综合案例实战——电商网站搜索排名统计
- Spark SQL 集成ElasticSearch的案例实战
- Spark SQL之案例实战(四)
- 10.Spark SQL:销售额统计案例实战
- NOIP2016 Day1t2 天天爱跑步
- TODO:小程序开发过程之体验者
- 统计ul下li个数在ul为class或id
- 栈的进栈和出栈
- bzoj4719 [Noip2016]天天爱跑步
- Spark SQL Hive数据源复杂综合案例实战
- Android基础第十天
- java事务处理全解析
- 操作系统复习3
- Spark SQL 集成ElasticSearch的案例实战
- 把二叉树打印出多行
- JavaScript高级程序设计6--BOM
- 关于文件
- javaweb基础(JSP)