本文章将对hive表数据估算和一些Hive 修改表数据的题进行详细解,希望对各位都有所帮助。


Spark与Hive集成

SparkSQL设计的目的是让用户能够使用SQL语法来处理Spark上的结构化数据。它支持丰富的数据源,可以是RDD也可以是外部数据源文件、json、csv、parquet、hive、hbase等。SparkSQL的一个重要分支是Spark兼容Hive,即Hive的元数据管理、HQL语法Spark中使用的、UDF、序列化和反序列化SerDers函数

SparkHive集成

这里会涉及到两个概念SparkonHive和HiveonSpark,那么两者有什么区别呢?

1.了解SparkonHive和HiveonSpark

1Hive上的Spark

Hive在这里扮演的角色是存储角色,Spark负责SQL的分析、优化和执行。具体可以理解为SparkSQL使用Hive语句来操作Hive表,底层计算引擎使用SparkRDD。具体流程如下

通过SparkSQL,加载Hive配置文件,获取Hive元数据信息(通常存储在MySQL或PostgreSQL等关系数据库中,建议不要使用内置的derby数据库,因为Derby数据库不支持多用户同时访

获取Hive的元数据信息后,就可以获取Hive表的数据;

通过SparkSQL操作Hive中的表;

2Hive上的Spark

Hive在这里的作用不仅仅是作为存储,还负责SQL分析和优化。Spark只负责计算,也就是说Spark的作用是执行引擎。一般会进行以下几种配置

配置hvie-sitelt;propertygt;lt;namegt;hiveexecutionenginelt;/namegt;lt;值gt;sparklt;/值gt;lt;描述gt;需要[mr、tez、spark]之一选择执行引擎选项有mrMapreduce、default、tez、spark虽然MR由于历史原因仍然是默认引擎,但它本身就是一个历史引擎,并且在Hive2行中已弃用。已删除,无需进一步警告lt;/descriptiongt;lt;/属性gt;将包复制到$HIVE_HOME/lib/。这种配置方式可能会因为依赖包的版本题而导致很多错误,处理起来很麻烦。一般情况下,需要编译Spark源码。

与Hive上的Spark相比,这种实现比较繁琐,并且必须重新编译Spark并导入Hive的依赖jar包。目前主流使用是SparkonHive。下面使用SparkonHive来讲解Spark与Hive的集成。

2.Spark在Hive流程上集成HiveSpark

1MySQL元数据库安装与配置

安装MySQL的安装配置参考

2创建并授权用户操作MySQL中的Hive元数据库

mysqlgt;创建用户39;39;标识为39;查询正常,0行受影响000secmysqlgt;将hivedb的所有权限授予39;39;由39确定;带授予选项;查询正常,0行受影响,1条警告000secmysqlgt;刷新权限;查询正常,0行受影响000sec3MySQLJDBC驱动程序包

这里有两种方法

方法一将MySQLJDBC驱动包复制到$SPARK_HOME/jars目录下;

方法二启动spark-sql命令行时指定--driver-class-path指定MySQL的JDBC驱动包位置

这里我选择第一种方法

4配置hive-sitelt;5高可用hdfs配置根据实际情况

如果hdfs是高可用的hdfs,即有多个namenode,有两种情况可以解决题

方法一hdfs的core-siteexportHADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop这两种方法需要选择其中一种,这里我选择第二种。

6启动spark-sql

启动之前,请确保Hadoop集群和Spark独立集群已成功启动。然后启动spark-sql:

[hadoopnode01Spark]$bin/spark-sql--masterSpark://node01:7077,node02:7077--confSparksqlwarehousedir=hdfs://mycluster/user/hive/warehouse注意

由于Spark20版本之后出现了SparkSession,所以在运行spark-sql时,会设置默认的sparksqlwarehousedir=spark-warehouse。此时,Hive与SparkSQL集成完成后,启动spark-sql脚本时,会在该目录下创建一个sparksqlwarehousedir指定的目录,用于存放spark-sql创建数据库和数据表信息,该目录与之前的hive数据信息不存在于同一路径下,也就是说spark-sql创建的数据库和表信息是本地的,不在HDFS上,不利于操作。所以,解决方案如下

启动spark-sql时,添加一个参数

--confsparksqlwarehousedir=hdfs://mycluster/user/hive/warehouse这样可以保证spark-sql启动时不会生成新的存放数据的目录。Sparksql和hive最终使用的是hdfs上hive存储数据的目录。

此时查看MySQL数据库,可以看到元数据信息已经创建完成

元数据信息

7日常操作

Spark-SQLGT;显示数据库;//检查哪些数据库spark-sqlgt;创建数据库mydb;//创建数据库//创建表sanguospark-sqlgt;创建表sanguogt;idbigint,master字符串,member字符串,Country字符串,powerint,武器字符串gt;rowformatdelimitedfieldsreturnedby39;//导入本地sanguotxt中的数据1、刘备、关羽、蜀、105、青龙偃月刀2、刘备、张飞、蜀、102、张八蛇矛3、刘备、赵云、蜀、100、剑4、刘备、马超、蜀、99、霸王枪5、刘备、黄忠、蜀、98、弓箭6、刘备、诸葛亮、蜀,64,羽扇豆7,曹操,张辽,魏国,95,刀8,曹操,典韦,魏国,99,刀9,曹操,郭嘉,魏国,64,34;spark-sqlgt;加载数据本地inpath39;intotablesangu;//查看数据spark-sqlgt;选自三国;查询结果

后记

元数据信息存储在MySQL中,MySQL中存储了描述hive表的描述信息,如数据库名、表名、列类型等元数据信息,同时也存储了hdfs的位置;

hive存储业务数据,用于离线分析的数据就是数据仓库;


本文主要是解一些hive表数据估算的题,其中对Hive 修改表数据的相关内容也进行了一些详细的解释,希望能帮助到诸位。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。