SparkSQL操作Hive数据仓库(spark-hive_2.11)

提前在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仓库结果如下:

                  

发布了74 篇原创文章 · 获赞 4 · 访问量 3190

猜你喜欢

转载自blog.csdn.net/u014635374/article/details/105458227