Hadoop(五)C#操作Hive

Hive

Hive将HiveQL(类sql语言)转为MapReduce,完成数据的查询与分析,减少了编写MapReduce的复杂度。它有以下优点:

  • 学习成本低:熟悉sql就能使用

  • 良好的数据分析:底层基于MapReduce实现

同样存在一些缺点:

  • HiveDL表达能力有限

  • 效率不高

  • Hive调优比较困难


Hive架构

  1. 用户通过Hive的用户接口(User Interfaces)与hive交互,常见的用户接口有CLI,JDBC/ODBC,WEB UI等

  2. Hive将元数据存在Meta Store中,元数据包括数据库、表、列、类型、数据所在目录等

  3. HiveQL Process Engine实现HiveQL的语法分析、优化生成对应的查询计划,存于HDFS中。

  4. 由Execution Engine实现HiveQL Process Engine与MapReduce的结合。最终实现对HDFS中数据的处理。

940ef20df2782936bd81d0f6b79199bc.png


Hive工作流程

3f5cde5664af7b25f1fc350f238d173d.png

  1. Execute Query:Hive接口,如命令行或Web UI发送查询驱动程序(任何数据库驱动程序,如JDBC,ODBC等)来执行。

  2. Get Plan:在驱动程序帮助下查询编译器,分析查询检查语法和查询计划或查询的要求。

  3. Get MetaData:编译器发送元数据请求到Metastore(任何数据库)。

  4. Send MetaData:Metastore发送元数据,以编译器的响应。

  5. Send Plan:编译器检查要求,并重新发送计划给驱动程序。到此为止,查询解析和编译完成。

  6. Excute Plan:驱动程序发送的执行计划到执行引擎。

  7. Excute Job:执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracke。

    1. MetaData Ops:在执行时,执行引擎可以通过Metastore执行元数据操作。

  8. Fetch Results:执行引擎接收来自数据节点的结果。

  9. Send Results:执行引擎发送这些结果值给驱动程序。

  10. Send Results:驱动程序将结果发送给Hive接口。


Hive安装

1.下载Hive3.1.2

https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/

2.解压

tar -zxvf apache-hive-3.1.2-bin.tar.gz

3.配置环境变量

vi /etc/profileexport HIVE_HOME=/usr/local/hive312/apache-hive-3.1.2-bin
export HIVE_CONF_DIR=/usr/local/hive312/apache-hive-3.1.2-bin/conf#生效
source /etc/profile

4.将mysql作为metastore,下载mysql-connetctor

https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.46

将其放入$HIVE_HOME/lib文件夹中

5.配置conf/hive-env.sh

cd conf
mv hive-env.sh.template hive-env.sh

6.将以下内容加入hive-env.sh

export JAVA_HOME=/usr/local/java18/jdk1.8.0_331
export HADOOP_HOME=/usr/local/hadoop323/hadoop-3.2.3
export HIVE_HOME=/usr/local/hive312/apache-hive-3.1.2-bin
export HIVE_CONF_DIR=/usr/local/hive312/apache-hive-3.1.2-bin/conf

7.添加conf/hive-site.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value><description>JDBC connect string for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value><description>Driver class name for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value><description>username to use against metastore database</description></property><property><name>javax.jdo.option.ConnectionPassword</name><value>admin</value><description>password to use against metastore database</description></property>
</configuration>

8.替换guava文件

因为hadoop/share/hadoop/common/lib目录下的guava和/apache-hive-3.1.2-bin/lib目录下的guava版本不同。需要将版本将hadoop高版本的guava拷贝到hive的目录下,删除hive低的版本。

cp /usr/local/hadoop323/hadoop-3.2.3/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive312/apache-hive-3.1.2-bin/lib/rm -rf /usr/local/hive312/apache-hive-3.1.2-bin/lib/guava-19.0.jar

9.初始化metastore

./bin/schematool -dbType mysql -initSchema

10.使用Hive

bin/hive

这种方式默认启动了cli,相当于以下命令

bin/hive --service cli

11.查看表

hive> show tables;

12.启动Hive Thrift Server

bin/hive --service hiveserver2 &

通过jps验证RunJar是否启动

9c1bede59c97f9a573d0154bf1a32dec.png

 也可以查看10000端口是否处于监听状态

[root@localhost apache-hive-3.1.2-bin]# netstat -anop |grep 10000
tcp6       0      0 :::10000                :::*                    LISTEN      12207/java           off (0.00/0/0)


Hive操作

Hive是一种数据库,可以定义数据库与表来结构化数据。

https://cwiki.apache.org/confluence/display/Hive//Home#Home-UserDocumentation


数据库操作

Hive中默认存在一个default的数据库,默认的操作都应用在这个库上,可以通过bin/hive  这个cli命令查看。

hive> show databases;
OK
default
Time taken: 0.075 seconds, Fetched: 1 row(s)

新建数据库

#新建数据库
CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>

新建一个chesterdb

create database chesterdb;

删除数据库

DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name  [RESTRICT|CASCADE];

CASCADE代表在删除数据库之前要把其中的表删除。

删除chesterdb

hive> drop database chesterdb;


表操作

新建表

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]

在defaultdb中新建一个表

CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)COMMENT 'Employee details'ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;

插入本地文件数据

新建一个e.txt文件

[root@localhost ~]# cat e.txt
1201    Gopal   45000   Technical manager
1202    Manisha 45000   Proof reader

将其load进入employee表

LOAD DATA LOCAL INPATH '/root/e.txt' OVERWRITE INTO TABLE employee;

查看employee中是否存在数据

select * from employee;

插入HDFS文件数据

load hdfs中的文件到hive,新建一个e2.txt

[root@localhost ~]# cat e2.txt
1203    Gopal1  45000   Technical manager
1204    Manisha1        45000   Proof reader

将其put到hdfs中的chesterdata文件夹

[root@localhost ~]# hdfs dfs -mkdir /chesterdata
[root@localhost ~]# hdfs dfs -put e2.txt /chesterdata

然后在hive的cli中将hdfs中的/chesterdata/e2.txt load到employee表,需要注意的是,load之后hdfs中的文件就会被删除

load data inpath '/chesterdata/e2.txt'  OVERWRITE INTO TABLE employee;

查看employee中是否存在数据

select * from employee;

删除表

DROP TABLE [IF EXISTS] table_name;


分区

新建分区

Hive可以通过分区实现数据的隔离,这样可实现数据的快速查询。

CREATE TABLE IF NOT EXISTS employee2 ( eid int, name String, salary String)COMMENT 'Employee details'PARTITIONED BY (destination String)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;

我们将e2.txt load进此表

hdfs dfs -put e2.txt /chesterdata
load data inpath '/chesterdata/e2.txt'  OVERWRITE INTO TABLE employee2;

重命名分区

ALTER TABLE employee2 PARTITION (destination='Technical manager') RENAME TO PARTITION (destination='T2');

删除分区

ALTER TABLE employee2 DROP  PARTITION (destination='T2');

查询

hive的查询支持我们常见的where、order by、group by、join等语句

select Name,count(1) from employee2 where destination='Technical manager' group by Name;

视图

hive也支持视图,创建视图语法如下

CREATE VIEW emp_v2 AS
select Name,count(1) from employee2 where destination='Technical manager' group by Name;

查看视图

select * from emp_v2;

C#如何连接Hive

可以通过odbc来连接。

1.首先需要配置hadoop,从任何主机登录的root用户可以作为任意组的用户

<property><name>hadoop.proxyuser.root.hosts</name><value>*</value>
</property>
<property><name>hadoop.proxyuser.root.groups</name><value>*</value>
</property>

重启hadoop

sbin/stop-dfs.sh
sbin/stop-yarn.shsbin/start-dfs.sh
sbin/start-yarn.sh

2.启动hiveserver2 thrift server,其默认端口为10000

bin/hive --service hiveserver2 &

可通过10002端口验证是否thrift server启动

591c64e1d5ee0c7e464cfbfa2776a6b0.png

3.下载odbc,并安装(同样有linux版本)

http://package.mapr.com/tools/MapR-ODBC/MapR_Hive/MapRHive_odbc_2.1.1.0013/Windows/

4.打开odbc,添加dsn

2cd21e21c5aab90058f683c72d0e4eaa.png

 5.新建console,并添加hive访问类

using System.Data;
using System.Data.Odbc;public class HiveOdbcClient
{public static HiveOdbcClient Current{get { return new HiveOdbcClient(); }}public void ExcuteNoQuery(string dns, string sql){OdbcConnection conn = null;try{conn = new OdbcConnection(dns);conn.Open();OdbcCommand cmd = new OdbcCommand(sql, conn);cmd.ExecuteNonQuery();}catch (Exception ex){throw ex;}finally{if (null != conn){conn.Close();}}}public DataSet Query(string dns, string sql, string tblName = "tbl"){DataSet set = new DataSet();OdbcConnection conn = null;try{conn = new OdbcConnection(dns);conn.Open();OdbcCommand cmd = conn.CreateCommand();cmd.CommandText = sql;OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);adapter.Fill(set, tblName);}catch (Exception ex){throw ex;}finally{if (null != conn){conn.Close();}}return set;}
}

通过C#直接新加hive表

string dns = "DSN=test;UID=root;PWD=";string sql = "show tables";string sql2 = "create table Employee(ID string,Code string,Name string)";
HiveOdbcClient.Current.ExcuteNoQuery(dns, sql2);Console.WriteLine(HiveOdbcClient.Current.Query(dns, sql));

6.通过bin/hive进入交互式命令,查看employee新建成功

hive> show tables;
OK
employee
Time taken: 0.62 seconds, Fetched: 1 row(s)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度优先搜索——八皇后问题

代码&#xff1a;&#xff08;控制台打印不了92种情况&#xff0c;只打印前10种&#xff09; 1 #include<iostream>2 #include<string>3 #include<windows.h>4 #define ok 15 #define error 06 using namespace std;7 8 9 int a[9][9]{0}; 10 int num0; 1…

python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介 正则表达式是一种描述字符的一种方式&#xff0c;通过该方式&#xff0c;匹配字符串。 正则表达式是自由的&#xff0c;一个字符的含义往往代表着一类字符&#xff0c;通过多个正则正则符号的组合描述&#xff0c;可以使组成的正则表达式能够描述一类字符串。 在开发中&a…

.NET性能优化-使用结构体替代类

前言我们知道在C#和Java明显的一个区别就是C#可以自定义值类型&#xff0c;也就是今天的主角struct&#xff0c;我们有了更加方便的class为什么微软还加入了struct呢&#xff1f;这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。那么使用结构体替代类有什么好处呢&…

ISE14.7兼容性问题集锦

一、 关于win8和win10不兼容性解决办法 &#xff08;win7不会出现闪退的问题&#xff0c;按安装流程做完就可以直接使用了&#xff09; 在安装目录下&#xff0c;我这里是D:\ISE_14.7\14.7\ISE_DS\ISE\lib\nt64中找到libPortability.dll和libPortabilityNOSH.dll两个文件夹&…

幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名

陪孩子一起阅读的精髓不是认字和背诵&#xff0c;亲子阅读的那些事 亲子阅读是当代的养育新潮流&#xff0c;但它还有更可贵的一面。 脾气再大的妈妈&#xff0c;都有温柔可爱的时刻&#xff0c;就是陪伴孩子阅读的时刻&#xff0c;曾经有一位在我看来算不上温柔的妈妈&#xf…

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 目录 一、地理配准工具条简介 二、地理配准过程 1、加载数据&#xff08;点击下载&#xff09;提取码&#xff1a;v9y8 2、加载地理配准工具条 3、添加控制点 …

php基础教程 第二步 通俗易懂的学习变量、常量与数据类型

简介 变量、常量以及数据类型 在编程中&#xff0c;变量指一个存储值的一个盒子&#xff0c;或者说容器。例如一个箱子&#xff0c;用来放杂物&#xff0c;这个箱子就是一个容器&#xff0c;值就为杂物。容器可以分为很多类型&#xff0c;例如瓶子、被子、盒子等。值也有很多类…

可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...

点击上方了解化学加VIP会员企业导读近日&#xff0c;中国科学院上海有机所游书力团队开发了一种可见光促进的吲哚衍生物分子内[22]环加成方法&#xff0c;可以极好的收率和立体选择性得到环丁烷稠合的四环吲哚螺环(Scheme 1&#xff0c;底部)。该成果近期发表在J. Am. Chem. So…

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

在经过了两年的准备&#xff0c;以及迁移了几个应用项目积累了让我有信心的经验之后&#xff0c;我最近在开始将团队里面最大的一个项目&#xff0c;从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发&#xff0c;最多有 50 多位开发者参与&#xff0c;代码…

ArcGIS实验教程——实验一:ArcGIS软件的认识与使用

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 实验目录 第一节 Esri简介 1.1 ESRI简介 1.2 Esri产品发展历程 第二节 ArcGIS简介 2.1 ArcGIS简介 2.2 ArcGIS产品体系 第三节 Desktop简介 3.1 Desktop简介…

10分钟学会vue滚动行为

滚动行为 什么是路由的滚动行为 当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样 注意: 这个功能只在 HTML5 history 模式下可用。在这个模式下我们需要启动一个服务 我们用scrollBehavior 方法来做路由滚…

php基础教程 第三步 学习字符串及相关函数

字符串 上一节中我们学习了 php 变量、常量以及数据类型的一些概念。这一节中进一步学习数据类型中的字符串类型及其相关操作方法。 字符串指一串字符的合集。例如单个字符 a&#xff0c;单个字符 b&#xff0c;单个字符 c…这些 a、b、c 皆是字符&#xff1b;当把这些字符连…

Mirantis OpenStack fuel web 安装 使用

2019独角兽企业重金招聘Python工程师标准>>> MirantisOpenStack-4.0.iso的下载地址&#xff1a;http://pan.baidu.com/s/1dDsuzXf。下载之后使用虚拟机或者物理机安装都可以&#xff0c;我使用的是vmware。需要把NAT的自动分配ip功能关闭 1、创建虚拟机 &#xff08…

[图] DevOps:提速从研发到交付流程

你的产品要让用户等多久&#xff1f;制定需求、排期开发、部署调试……这些流程都再跑一遍&#xff1f;传统产品发布流程长&#xff0c;多分支、环境不一、人工操作导致容易出错。面对这些传统发布难题&#xff0c;DevOps才是正确的出路。

php基础教程 第四步 学习运算符

在前面的章节中&#xff0c;以及了解了一些运算法&#xff0c;接下来再讲解一些常规运算法。 加运算法&#xff0c;用来使左右两边的值或表达式进行加法计算。例如有一个变量$a&#xff0c;一个变量$b&#xff0c;它们的值都为9&#xff0c;$a$b为99等于10.。输出使用echo&…

JavaScript基础学习(七)—BOM

BOM(Browser Object Model): 浏览器对象模型。提供了独立于内容而与浏览器窗口交互的对象&#xff0c;BOM主要用于管理窗口和窗口之间的通讯。 一、Navigator对象 navigator对象通常用于获取浏览器和操作系统的信息。 navigator对象是window对象的属性&#xff0c;中文是&…

Spring初识

从上学期开始决心开始学习Spring&#xff0c;自己总是利用不好时间&#xff0c;到处瞎忙&#xff0c;结果浪费了好多时间。想着利用暑假的时间&#xff0c;专心看会儿书。最初我在Spring官网下载jar包的时候&#xff0c;忙会儿了半天愣是没找到下载的链接&#xff0c;瞬间觉得学…

Blazor University (17)使用 RenderFragments 模板化组件

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/使用 RenderFragments 模板化组件源代码[1]到目前为止&#xff0c;我们已经创建了基于参数生成 100% 渲染输出的组件&#xff0c;但组件并不总是那么简单。有时我们需要创建将…

php基础教程 第五步 逻辑控制

逻辑判断 在开发项目时&#xff0c;竟然会出现逻辑控制。例如当用户输入“hello”时你需要自动回复“hello 欢迎”&#xff0c;当用户设置的定时时间到达时&#xff0c;你需要提醒用户时间已经结束&#xff1b;再举个例子&#xff0c;在玩网络游戏时&#xff0c;用户控制的角色…

博图程序需要手动同步_贴吧求助帖博图实例单按钮控制灯的程序

接上一期在贴吧看见的求助帖(上图看得见水印)&#xff0c;因为没人回复&#xff0c;发帖的楼主好像删除了帖子。结果我抽时间用博图15.1&#xff0c;S71200做了一个&#xff0c;希望给需要帮助的新人能够起到作用&#xff0c;感觉有用的话可以关注一下我的公众号低压电工&#…