提前在Hive数据仓库中创建库spark_sql_hive hive (default)> create database spark_sql_hive; OK Time taken: 5.502 seconds
首先准备people.txt与Peoplescores.txt两个文本文件 people.txt内容为:(人员信息表:姓名,年龄) Michael 29 Andy 30 Justin 19
Peoplescores.txt内容为:(人员分数表:姓名,分数)
Michael 99 Andy 97 Justin 68
上传两个配置文件到/home/hadoop/ 目录maven管理jar包如下:
<properties> <scala.version>2.11.8</scala.version> </properties> <repositories> <repository> <id>repos</id> <name>Repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> <repository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>repos</id> <name>Repository</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </pluginRepository> <pluginRepository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </pluginRepository> </pluginRepositories> <dependencies> <dependency> <!-- Spark ,依赖的Scala版本为Scala 2.12.x版本 (View all targets) 否则会报错 java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object; --> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.0</version> </dependency> <dependency> <!-- Spark --> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.0</version> </dependency> <!--添加hive依赖,spark操作hive依赖--> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.4.0</version> </dependency> <!-- 2.12.x需要与spark的2.12对应--> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> </dependencies>
package org.jy.data.yh.bigdata.drools.scala.goods.hive
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}
/**
*
* Spark集群中使用Hive数据仓库
*
*/
object SparkSQLOnHive { // 提交到集群运行
def main(args:Array[String]):Unit = {
// 创建SparkConf对象
val sparkConf = new SparkConf()
.setMaster("spark://centoshadoop1:7077,centoshadoop2:7077")
.setAppName("SparkSQLOnHive") // 设置Spark应用名称
// 创建SparkContext上下文对象
val sparkContext = new SparkContext(sparkConf);
/**
* 第一:直接通过saveAsTable的方式把DataFrame的数据保存到Hive数据仓库
* 第二:可以直接通过HiveContext.table方法来直接加载Hive中的表而生成DataFrame
*/
val hiveContext = new HiveContext(sparkContext)
hiveContext.sql("use spark_sql_hive") // 需要提前在Hive中创建Hive表
hiveContext.sql("drop table if exists people") // 删除同名表
hiveContext.sql("create table if not exists people(name STRING,age INT)")//创建自定义的表
/**
* 把本地的数据加载到Hive数据仓库中,背后实际上发生了数据的复制
* 当然,也可以通过LOAD DATA INPATH 获取HDFS等上面的数据到Hive中,此时发生了数据的移动
*/
hiveContext.sql("load data local inpath '/home/hadoop/people.txt'into table people")
hiveContext.sql("drop table if exists peoplescores") // 删除peoplescores
hiveContext.sql("create table if not exists peoplescores(name STRING,score INT)")
hiveContext.sql("load data local inpath '/home/hadoop/peoplescores.txt' into table peoplescores")
/**
* 通过HiveContext使用join直接基于Hive中的两张表进行操作,获得day90分的人的
* name,score,age
*/
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")
/**
* resultDF都是大于90分的人员信息表Data Frame,包括姓名,分数,调用DataFrame的saveAsTable方法,将resultDF中大于90分的记录保存到Hive
* 数据表peopleinformationresult中
*/
hiveContext.sql("drop table if exists peopleinformationresult")
// 数据插入,Spark2.0.x版本后提交,spark1.x resultDF.savaAsTable("peopleinformationresult");
resultDF.write.mode(SaveMode.Overwrite).saveAsTable("peopleinformationresult")
val dataFrameHive = hiveContext.table("peopleinformationresult")
dataFrameHive.show();
sparkContext.stop()
}
}
maven打包后提交集群:
bin/spark-submit \
--master spark://centoshadoop1:7077,centoshadoop2:7077 \
--executor-cores 1 \
--executor-memory 2G \
--total-executor-cores 1 \
--class org.jy.data.yh.bigdata.drools.scala.goods.hive.SparkSQLOnHive \
/home/hadoop/tools/SSO-Scala-SparkSql-1.0-SNAPSHOT.jar
查看hive仓库结果如下: