1、准备
安装hive,配置hive-env.sh 和hive-site.xml文件。将hive-site.xml文件拷贝到spark安装目录下,也可以在spark-sumit提交时指定hive-sitte.xml位置。(确保Mysql的jar包已在hive的lib文件夹中,或者在spark-sumit提交时指定)
2、实例
package org.apache.spark.sql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
/**
* @Title : SparkSQL2Hive.scala
* @Package org.apache.spark.sql
* @Description: TODO(SparkSQL与Hive的集成实践)
* @author 涛哥
* @date 2016年4月13日 下午1:08:13
* @version V1.0
*/
object SparkSQL2Hive {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkSQL2Hive").setMaster("spark://192.168.59.128:7077")
val sc = new SparkContext(conf) //创建SparkContext对象,通过传入SparkConf实例来定制Spark运行的具体参数和配置信息
/**
* 第一:在目前企业级大数据Spark开发的时候绝大多数情况下是采用Hive作为数据仓库的;
* Spark提供了Hive的支持功能,Spark通过HiveContext可以直接操作Hive中的数据;
* 基于HiveContext我们可以使用sql/hql两种方式才编写SQL语句对Hive进行操作,包括
* 创建表、删除表、往表里导入数据以及用SQL语法构造各种SQL语句对表中的数据进行CRUD操作
* 第二:我们也可以直接通过saveAsTable的方式把DataFrame中的数据保存到Hive数据仓库中;
* 第三:可以直接通过HiveContext.table方法来直接加载Hive中的表而生成DataFrame
*/
val hiveContext = new HiveContext(sc)
hiveContext.sql("use hive") //使用Hive数据仓库中的hive数据库
hiveContext.sql("DROP TABLE IF EXISTS people") //删除同名的Table
hiveContext.sql("CREATE TABLE IF NOT EXISTS people(name STRING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'" ) //创建自定义的Table,此时指明导入方式
hiveContext.sql("LOAD DATA LOCAL INPATH '/home/soft/people.txt' INTO TABLE people")
hiveContext.sql("DROP TABLE IF EXISTS peoplescores")
hiveContext.sql("CREATE TABLE IF NOT EXISTS peoplescores(name STRING, score INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t' LINES TERMINATED BY '\\n'")
hiveContext.sql("LOAD DATA LOCAL INPATH '/home/soft/peoplescore.txt' INTO TABLE peoplescores")
/**
* 通过HiveContext使用join直接基于Hive中的两张表进行操作获得大于90分的人的name、age、score
*/
val resultDF = hiveContext.sql("SELECT pi.name, pi.age, ps.score "
+ "FROM people pi JOIN peoplescores ps ON pi.name=ps.name WHERE ps.score>90")
hiveContext.sql("DROP TABLE IF EXISTS peopleinformationresult")
/**
* 通过saveAsTable创建一张Hive Managed Table, 当删除该表的时候,数据也会一起被删除(磁盘上的数据不再存在)
*/
resultDF.saveAsTable("peopleinformationresult")
/**
* 使用HiveContext的table方法可以直接去读Hive数据仓库中的Table并生成DataFrame,接下来就可以
* 进行机器学习、图计算、各种复杂ETL等操作;
*/
val dataFromHive = hiveContext.table("peopleinformationresult")
dataFromHive.show()
}
}
注:将项目打成jar包,上传到安装spark的机器,执行以下命令
./bin/spark-submit --class org.apache.spark.sql.SparkSQL2Hive --file /hom--driver-class-path /home/soft/hive-1.2.1/lib/mysql-connector-java-5.1.21.jar --master spark://192.168.59.128:7077 /home/soft/spark-1.6.1-bin-hadoop2.4/SparkSQL2Hive .jar