Hive為什么這么受歡迎?看完Hive架構(gòu)以及應(yīng)用介紹,你就明白了!
前言
Hive這個(gè)框架在Hadoop的生態(tài)體系結(jié)構(gòu)中占有及其重要的地位,在實(shí)際的業(yè)務(wù)當(dāng)中用的也非常多,可以說Hadoop之所以這么流行在很大程度上是因?yàn)镠ive的存在。那么Hive究竟是什么,為什么在Hadoop家族中占有這么重要的地位,本篇文章將圍繞Hive的體系結(jié)構(gòu)(架構(gòu))、Hive的操作、Hive與Hbase的區(qū)別等對(duì)Hive進(jìn)行全方面的闡述。
在此之前,先給大家介紹一個(gè)業(yè)務(wù)場景,讓大家感受一下為什么Hive如此的受歡迎:
業(yè)務(wù)描述:統(tǒng)計(jì)業(yè)務(wù)表consumer.txt中北京的客戶有多少位?下面是相應(yīng)的業(yè)務(wù)數(shù)據(jù):
- id city name sex
- 0001 beijing zhangli man
- 0002 guizhou lifang woman
- 0003 tianjin wangwei man
- 0004 chengde wanghe woman
- 0005 beijing lidong man
- 0006 lanzhou wuting woman
- 0007 beijing guona woman
- 0008 chengde houkuo man
首先我先用大家所熟悉的MapReduce程序來實(shí)現(xiàn)這個(gè)業(yè)務(wù)分析,完整代碼如下:
- package IT;
- import java.io.IOException;
- import java.net.URI;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FSDataInputStream;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IOUtils;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.Mapper;
- import org.apache.hadoop.mapreduce.Reducer;
- import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
- import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
- public class Consumer
- {
- public static String path1 = "hdfs://192.168.80.80:9000/consumer.txt";
- public static String path2 = "hdfs://192.168.80.80:9000/dir";
- public static void main(String[] args) throws Exception
- {
- FileSystem fileSystem = FileSystem.get(new URI(path1) , new Configuration());
- if(fileSystem.exists(new Path(path2)))
- {
- fileSystem.delete(new Path(path2), true);
- }
- Job job = new Job(new Configuration(),"Consumer");
- FileInputFormat.setInputPaths(job, new Path(path1));
- job.setInputFormatClass(TextInputFormat.class);
- job.setMapperClass(MyMapper.class);
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(LongWritable.class);
- job.setNumReduceTasks(1);
- job.setPartitionerClass(HashPartitioner.class);
- job.setReducerClass(MyReducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(LongWritable.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- FileOutputFormat.setOutputPath(job, new Path(path2));
- job.waitForCompletion(true);
- //查看執(zhí)行結(jié)果
- FSDataInputStream fr = fileSystem.open(new Path("hdfs://hadoop80:9000/dir/part-r-00000"));
- IOUtils.copyBytes(fr, System.out, 1024, true);
- }
- public static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>
- {
- public static long sum = 0L;
- protected void map(LongWritable k1, Text v1,Context context) throws IOException, InterruptedException
- {
- String[] splited = v1.toString().split("\t");
- if(splited[1].equals("beijing"))
- {
- sum++;
- }
- }
- protected void cleanup(Context context)throws IOException, InterruptedException
- {
- String str = "beijing";
- context.write(new Text(str),new LongWritable(sum));
- }
- }
- public static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>
- {
- protected void reduce(Text k2, Iterable<LongWritable> v2s,Context context)throws IOException, InterruptedException
- {
- for (LongWritable v2 : v2s)
- {
- context.write(k2, v2);
- }
- }
- }
- }
MapReduce程序代碼運(yùn)行結(jié)果如下:

從運(yùn)行結(jié)果可以看出:在consumer.txt業(yè)務(wù)表中,北京的客戶共有三位。下面我們將用Hive來實(shí)現(xiàn)相同的功能,即統(tǒng)計(jì)業(yè)務(wù)表consumer.txt中北京的客戶有多少位?
Hive操作如下:

Hive運(yùn)行結(jié)果如下:
- OK
- beijing 3
- Time taken: 19.768 seconds, Fetched: 1 row(s)
到這里,是不是感覺Hive這個(gè)運(yùn)行框架很神奇-----對(duì)于相同的業(yè)務(wù)邏輯只需要寫幾行Sql命令就可以獲取我們所需要的結(jié)果,這也恰恰是Hive為什么這么流行的原因,Hive的優(yōu)勢(shì)主要體現(xiàn)在:
①Hive支持標(biāo)準(zhǔn)的SQL語法,免去了用戶編寫MapReduce程序的過程,大大減少了公司的開發(fā)成本
②Hive的出現(xiàn)可以讓那些精通SQL技能、但是不熟悉MapReduce 、編程能力較弱與不擅長Java語言的用戶能夠在HDFS大規(guī)模數(shù)據(jù)集上很方便地利用SQL 語言查詢、匯總、分析數(shù)據(jù),畢竟精通SQL語言的人要比精通Java語言的多得多
③Hive是為大數(shù)據(jù)批量處理而生的,Hive的出現(xiàn)解決了傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(MySql、Oracle)在大數(shù)據(jù)處理上的瓶頸
好了,上面通過一個(gè)簡單的小業(yè)務(wù)場景說明了Hive的巨大優(yōu)勢(shì),接下來將進(jìn)入本篇文章的正題。
一:Hive體系結(jié)構(gòu)(架構(gòu))的介紹
1、Hive的概念:
①Hive是為了簡化用戶編寫MapReduce程序而生成的一種框架,使用MapReduce做過數(shù)據(jù)分析的人都知道,很多分析程序除業(yè)務(wù)邏輯不同外,程序流程基本一樣。在這種情況下,就需要Hive這樣的用戶編程接口。Hive提供了一套類SQL的查詢語言,稱為QL,而在創(chuàng)造Hive框架的過程中之所以使用SQL實(shí)現(xiàn)Hive是因?yàn)榇蠹覍?duì)SQL語言非常的熟悉,轉(zhuǎn)換成本低,可以大大普及我們Hadoop用戶使用的范圍,類似作用的Pig就不是通過SQL實(shí)現(xiàn)的。
Hive是基于Hadoop的一個(gè)開源數(shù)據(jù)倉庫系統(tǒng),可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的sql查詢功能,Hive可以把SQL中的表、字段轉(zhuǎn)換為HDFS中的目錄、文件。
②Hive是建立在Hadoop之上的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架、是為了減少M(fèi)apReduce編寫工作的批處理系統(tǒng),Hive本身不存儲(chǔ)和計(jì)算數(shù)據(jù),它完全依賴于HDFS和MapReduce。Hive可以理解為一個(gè)客戶端工具,將我們的sql操作轉(zhuǎn)換為相應(yīng)的MapReduce jobs,然后在Hadoop上面運(yùn)行。
在開始為大家列舉的consumer.txt小業(yè)務(wù)當(dāng)中,從編寫Sql到最后得出Beijing 3的分析結(jié)果實(shí)際上中間走的是MapReduce程序, 只不過這個(gè)MapReduce程序不用用戶自己編寫,而是由Hive這個(gè)客戶端工具將我們的sql操作轉(zhuǎn)化為了相應(yīng)的MapReduce程序,下面是我們運(yùn)行sql命令時(shí)顯示的相關(guān)日志:
- hive> select city,count(*)
- > from t4
- > where city='beijing'
- > group by city;
- Total MapReduce jobs = 1
- Launching Job 1 out of 1
- Number of reduce tasks not specified. Estimated from input data size: 1
- In order to change the average load for a reducer (in bytes):
- set hive.exec.reducers.bytes.per.reducer=<number>
- In order to limit the maximum number of reducers:
- set hive.exec.reducers.max=<number>
- In order to set a constant number of reducers:
- set mapred.reduce.tasks=<number>
- Starting Job = job_1478233923484_0902, Tracking URL = http://hadoop22:8088/proxy/application_1478233923484_0902/
- Kill Command = /usr/local/hadoop/bin/hadoop job -kill job_1478233923484_0902
- Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
- 2016-11-09 11:36:36,688 Stage-1 map = 0%, reduce = 0%
- 2016-11-09 11:36:42,018 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:43,062 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:44,105 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:45,149 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:46,193 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:47,237 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:48,283 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.21 sec
- 2016-11-09 11:36:49,329 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 3.7 sec
- 2016-11-09 11:36:50,384 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 3.7 sec
- MapReduce Total cumulative CPU time: 3 seconds 700 msec
- Ended Job = job_1478233923484_0902
- MapReduce Jobs Launched:
- Job 0: Map: 1 Reduce: 1 Cumulative CPU: 3.7 sec HDFS Read: 419 HDFS Write: 10 SUCCESS
- Total MapReduce CPU Time Spent: 3 seconds 700 msec
- OK
- beijing 3
- Time taken: 19.768 seconds, Fetched: 1 row(s)
從日志可以看出,Hive將我們的sql命令解析成了相應(yīng)的MapReduce任務(wù),最后得到了我們的分析結(jié)果。
③Hive可以認(rèn)為是MapReduce的一個(gè)封裝、包裝。Hive的意義就是在業(yè)務(wù)分析中將用戶容易編寫、會(huì)寫的Sql語言轉(zhuǎn)換為復(fù)雜難寫的MapReduce程序,從而大大降低了Hadoop學(xué)習(xí)的門檻,讓更多的用戶可以利用Hadoop進(jìn)行數(shù)據(jù)挖掘分析。
為了讓大家容易理解Hive的實(shí)質(zhì)-------“Hive就是一個(gè)SQL解析引擎,將SQL語句轉(zhuǎn)化為相應(yīng)的MapReduce程序”這句話,博主用一個(gè)圖示進(jìn)行示例:

從圖示可以看出,Hive從某種程度上講就是很多“SQL—MapReduce”框架的一個(gè)封裝,可以將用戶編寫的Sql語言解析成對(duì)應(yīng)的MapReduce程序,最終通過MapReduce運(yùn)算框架形成運(yùn)算結(jié)果提交給Client。
2、Hive體系結(jié)構(gòu)的介紹
下面是Hive的體系結(jié)構(gòu)圖:

Hive的體系結(jié)構(gòu)可以分為以下幾個(gè)部分:
①用戶接口:包括shell命令、Jdbc/Odbc和WebUi,其中最常用的是shell這個(gè)客戶端方式對(duì)Hive進(jìn)行相應(yīng)操作
②Hive解析器(驅(qū)動(dòng)Driver):Hive解析器的核心功能就是根據(jù)用戶編寫的Sql語法匹配出相應(yīng)的MapReduce模板,形成對(duì)應(yīng)的MapReduce job進(jìn)行執(zhí)行。
③Hive元數(shù)據(jù)庫(MetaStore):Hive將表中的元數(shù)據(jù)信息存儲(chǔ)在數(shù)據(jù)庫中,如derby(自帶的)、Mysql(實(shí)際工作中配置的),Hive中的元數(shù)據(jù)信息包括表的名字、表的列和分區(qū)、表的屬性(是否為外部表等)、表的數(shù)據(jù)所在的目錄等。Hive中的解析器在運(yùn)行的時(shí)候會(huì)讀取元數(shù)據(jù)庫MetaStore中的相關(guān)信息。
在這里和大家說一下為什么我們?cè)趯?shí)際業(yè)務(wù)當(dāng)中不用Hive自帶的數(shù)據(jù)庫derby,而要重新為其配置一個(gè)新的數(shù)據(jù)庫Mysql,是因?yàn)閐erby這個(gè)數(shù)據(jù)庫具有很大的局限性:derby這個(gè)數(shù)據(jù)庫不允許用戶打開多個(gè)客戶端對(duì)其進(jìn)行共享操作,只能有一個(gè)客戶端打開對(duì)其進(jìn)行操作,即同一時(shí)刻只能有一個(gè)用戶使用它,自然這在工作當(dāng)中是很不方便的,所以我們要重新為其配置一個(gè)數(shù)據(jù)庫。
④Hadoop:Hive用HDFS進(jìn)行存儲(chǔ),用MapReduce進(jìn)行計(jì)算-------Hive這個(gè)數(shù)據(jù)倉庫的數(shù)據(jù)存儲(chǔ)在HDFS中,業(yè)務(wù)實(shí)際分析計(jì)算是利用MapReduce執(zhí)行的。
從上面的體系結(jié)構(gòu)中可以看出,在Hadoop的HDFS與MapReduce以及MySql的輔助下,Hive其實(shí)就是利用Hive解析器將用戶的SQl語句解析成對(duì)應(yīng)的MapReduce程序而已,即Hive僅僅是一個(gè)客戶端工具,這也是為什么我們?cè)贖ive的搭建過程中沒有分布與偽分布搭建的原因。(Hive就像是劉邦一樣,合理的利用了張良、韓信與蕭何的輔助,從而成就了一番大事!)
3、Hive的運(yùn)行機(jī)制
Hive的運(yùn)行機(jī)制如下圖所示:

Hive的運(yùn)行機(jī)制正如圖所示:創(chuàng)建完表之后,用戶只需要根據(jù)業(yè)務(wù)需求編寫Sql語句,而后將由Hive框架將Sql語句解析成對(duì)應(yīng)的MapReduce程序,通過MapReduce計(jì)算框架運(yùn)行job,便得到了我們最終的分析結(jié)果。
在Hive的運(yùn)行過程中,用戶只需要?jiǎng)?chuàng)建表、導(dǎo)入數(shù)據(jù)、編寫Sql分析語句即可,剩下的過程將由Hive框架自動(dòng)完成,而創(chuàng)建表、導(dǎo)入數(shù)據(jù)、編寫Sql分析語句其實(shí)就是數(shù)據(jù)庫的知識(shí)了,Hive的運(yùn)行過程也說明了為什么Hive的存在大大降低了Hadoop的學(xué)習(xí)門檻以及為什么Hive在Hadoop家族中占有著那么重要的地位。
二:Hive的操作
Hive的操作對(duì)于用戶來說實(shí)際上就是表的操作、數(shù)據(jù)庫的操作。下面我們將圍繞兩個(gè)方面進(jìn)行介紹:
1、Hive的基本命令.
啟動(dòng)hive命令行:
- $>hive/bin/hive
- $hive>show databases ; -- 顯式數(shù)據(jù)庫
- $hive>create database mydb ; -- 創(chuàng)建數(shù)據(jù)庫
- $hive>use mydb ; -- 使用庫
- $hive>create table custs(id int , name string) ; -- 建表
- $hive>desc custs ; -- 查看表結(jié)構(gòu)
- $hive>desc formatted custs ; -- 查看格式化表結(jié)構(gòu)
- $hive>insert into custs(id,name) values(1,'tom'); -- 插入數(shù)據(jù),轉(zhuǎn)成mr.
- $hive>select * from custs ; -- 查詢,沒有mr
- $hive>select * from custs order by id desc ; -- 全排序,會(huì)生成mr.
- $hive>exit ; -- 退出終端
- 查看mysql中的元信息:
- select * from dbs ; -- 存放庫信息
- select * from tbls ; -- 存放表信息
2、Hive表------內(nèi)部表、外部表、分區(qū)表的創(chuàng)建
所謂內(nèi)部表就是普通表,創(chuàng)建語法格式為:

實(shí)際操作:

外部表(external table)的創(chuàng)建語法格式為:

注意:最后一行寫到的是目錄dir,文件就不用寫了,Hive表會(huì)自動(dòng)到dir目錄下讀取所有的文件file
我在實(shí)際的操作過程當(dāng)中發(fā)現(xiàn),location關(guān)聯(lián)到的目錄下面必須都是文件,不能含有其余的文件夾,不然讀取數(shù)據(jù)的時(shí)候會(huì)報(bào)錯(cuò)。

實(shí)際操作:

內(nèi)部表與外部表的區(qū)別:
- 內(nèi)部表在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù)倉庫目錄中(hive.metastore.warehouse.dir),之后用戶對(duì)數(shù)據(jù)的訪問將會(huì)直接在數(shù)據(jù)倉庫目錄中完成;刪除內(nèi)部表時(shí),內(nèi)部表中的數(shù)據(jù)和元數(shù)據(jù)信息會(huì)被同時(shí)刪除。
- 外部表在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)并不會(huì)被移動(dòng)到數(shù)據(jù)倉庫目錄中,只是與外部表建立一個(gè)鏈接(相當(dāng)于文件的快捷方式一樣);刪除外部表時(shí),僅刪除該鏈接。
補(bǔ)充:在工作中發(fā)現(xiàn),對(duì)于外部表,即使hive中的表刪除了,但是在HDFS中表的location仍然存在。
分區(qū)表的概念:指的是我們的數(shù)據(jù)可以分區(qū),即按照某個(gè)字段將文件劃分為不同的標(biāo)準(zhǔn),分區(qū)表的創(chuàng)建是通過在創(chuàng)建表時(shí)啟用partitioned by來實(shí)現(xiàn)的。
分區(qū)表的創(chuàng)建語法格式為:

注意:分區(qū)表在加載數(shù)據(jù)的過程中要指定分區(qū)字段,否則會(huì)報(bào)錯(cuò),正確的加載方式如下:
- load data local inpath ‘/usr/local/consumer.txt’ into table t1 partition (day=2) ;
其余的操作和內(nèi)部表、外部表是一樣的。
實(shí)際操作:

參考2:
- CREATE EXTERNAL TABLE `fdm_buffalo_3_5_task_exec_time`(
- `task_id` int COMMENT '任務(wù)id',
- `task_version` string COMMENT '任務(wù)版本',
- `exec_time` string COMMENT '平均執(zhí)行時(shí)長')
- PARTITIONED BY (
- `dt` string)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY '\t';
- 實(shí)際:
- hive> show create table fdm_buffalo_3_5_task_exec_time;
- OK
- CREATE EXTERNAL TABLE `fdm_buffalo_3_5_task_exec_time`(
- `task_id` int COMMENT '任務(wù)id',
- `task_version` string COMMENT '任務(wù)版本',
- `exec_time` string COMMENT '平均執(zhí)行時(shí)長')
- PARTITIONED BY (
- `dt` string)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY '\t'
- STORED AS INPUTFORMAT
- 'org.apache.hadoop.mapred.TextInputFormat'
- OUTPUTFORMAT
- 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
- LOCATION
- 'hdfs://ns5/user/dd_edw/fdm.db/fdm_buffalo_3_5_task_exec_time'
- TBLPROPERTIES (
- 'mart_name'='dd_edw',
- 'transient_lastDdlTime'='1555384611')
- Time taken: 0.036 seconds, Fetched: 17 row(s)
3、將數(shù)據(jù)文件加載(導(dǎo)入)到Hive表中
在Hive中創(chuàng)建完表之后,我們隨后自然要向表中導(dǎo)入數(shù)據(jù),但是在導(dǎo)入數(shù)據(jù)的時(shí)候和我們的傳統(tǒng)數(shù)據(jù)庫(MySql、Oracle)是不同的:Hive不支持一條一條的用insert語句進(jìn)行插入操作,也不支持update的操作。Hive表中的數(shù)據(jù)是以load的方式,加載到建立好的表中。數(shù)據(jù)一旦導(dǎo)入,則不可修改。要么drop掉整個(gè)表,要么建立新的表,導(dǎo)入新的數(shù)據(jù)。
導(dǎo)入數(shù)據(jù)的語法格式為:

導(dǎo)入數(shù)據(jù)時(shí)要注意一下幾點(diǎn):
- local inpath表示從本地linux中向Hive表中導(dǎo)入數(shù)據(jù),inpath表示從HDFS中向Hive表中導(dǎo)入數(shù)據(jù)
- 默認(rèn)是向原Hive表中追加數(shù)據(jù),overwrite表示覆蓋表中的原數(shù)據(jù)進(jìn)行導(dǎo)入
- partition是分區(qū)表特有的,而且在導(dǎo)入數(shù)據(jù)數(shù)據(jù)時(shí)是必須添加的,否則會(huì)報(bào)錯(cuò)
- load 操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件復(fù)制/移動(dòng)到 Hive 表對(duì)應(yīng)的位置,即Hive 在加載數(shù)據(jù)的過程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動(dòng)到相應(yīng)的表中
導(dǎo)入示例代碼:(注意overwrite的用法)
- hive> load data local inpath "/home/dd_edw/zmy_project/task_relations.txt" overwrite into table fdm.chevrolet_buffalo_task_recusion_relations partition(dt='2019-05-28');
- Loading data to table fdm.chevrolet_buffalo_task_recusion_relations partition (dt=2019-05-28)
- Moved: 'hdfs://ns5/user/dd_edw/fdm.db/chevrolet_buffalo_task_recusion_relations/dt=2019-05-28/task_relations.txt' to trash at: hdfs://ns5/user/dd_edw/.Trash/Current
- Moved: 'hdfs://ns5/user/dd_edw/fdm.db/chevrolet_buffalo_task_recusion_relations/dt=2019-05-28/task_relations_copy_1.txt' to trash at: hdfs://ns5/user/dd_edw/.Trash/Current
- Partition fdm.chevrolet_buffalo_task_recusion_relations{dt=2019-05-28} stats: [numFiles=1, numRows=0, totalSize=272475104, rawDataSize=0]
- OK
- Time taken: 3.381 seconds
- hive> dfs -ls hdfs://ns5/user/dd_edw/fdm.db/chevrolet_buffalo_task_recusion_relations/*/ ;
- Found 1 items
- -rwxr-xr-x 3 dd_edw dd_edw 272475104 2019-05-29 20:08 hdfs://ns5/user/dd_edw/fdm.db/chevrolet_buffalo_task_recusion_relations/dt=2019-05-28/task_relations.txt
4、Hive添加分區(qū)操作:
正確語句:
- hive> ALTER TABLE fdm_buffalo_3_5_task_exec_time ADD IF NOT EXISTS PARTITION (dt='2019-04-15');
- OK
- Time taken: 0.059 seconds
錯(cuò)誤語句:
- hive> alter table fdm_buffalo_3_5_task_exec_time if not exists add partition (dt='2019-04-15');
- NoViableAltException(132@[])
- at org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.java:8170)
- at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:7635)
- at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:2798)
- at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1731)
- at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1136)
- at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:202)
- at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)
- at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:411)
- at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:320)
- at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1372)
- at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1425)
- at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1150)
- at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1093)
- at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:241)
- at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:191)
- at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:551)
- at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:969)
- at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:912)
- at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:824)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:606)
- at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
- at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
- FAILED: ParseException line 1:43 cannot recognize input near 'if' 'not' 'exists' in alter table statement
5、查看某個(gè)分區(qū)
- desc formatted bdm.bdm_dispatch_1_d_task_da partition(dt='2019-07-14');
三:Hive與Hbase的區(qū)別
其實(shí)從嚴(yán)格意義上講,Hive與Hbase就不應(yīng)該談區(qū)別,談區(qū)別的原因無非就是Hive與Hbase本身都涉及到了表的創(chuàng)建、向表中插入數(shù)據(jù)等等。所以我們希望找到Hive與Hbase的區(qū)別,但是為什么兩者談不上區(qū)別呢,原因如下:
- 根據(jù)上文分析,Hive從某種程度上講就是很多“SQL—MapReduce”框架的一個(gè)封裝,即Hive就是MapReduce的一個(gè)封裝,Hive的意義就是在業(yè)務(wù)分析中將用戶容易編寫、會(huì)寫的Sql語言轉(zhuǎn)換為復(fù)雜難寫的MapReduce程序。
- Hbase可以認(rèn)為是hdfs的一個(gè)包裝。他的本質(zhì)是數(shù)據(jù)存儲(chǔ),是個(gè)NoSql數(shù)據(jù)庫;hbase部署于hdfs之上,并且克服了hdfs在隨機(jī)讀寫方面的缺點(diǎn)。
因此若要問Hive與Hbase之前的區(qū)別,就相當(dāng)于問HDFS與MapReduce之間的區(qū)別,而HDFS與MapReduce兩者之間談區(qū)別意義并不大。
但是當(dāng)我們非要談Hbase與Hive的區(qū)別時(shí),可以從以下幾個(gè)方面進(jìn)行討論:
Hive和Hbase是兩種基于Hadoop的不同技術(shù)–Hive是一種類SQL的引擎,并且運(yùn)行MapReduce任務(wù),Hbase是一種在Hadoop之上的NoSQL 的Key/vale數(shù)據(jù)庫。當(dāng)然,這兩種工具是可以同時(shí)使用的。就像用Google來搜索,用FaceBook進(jìn)行社交一樣,Hive可以用來進(jìn)行統(tǒng)計(jì)查詢,HBase可以用來進(jìn)行實(shí)時(shí)查詢,數(shù)據(jù)也可以從Hive寫到Hbase,設(shè)置再從Hbase寫回Hive。
Hive適合用來對(duì)一段時(shí)間內(nèi)的數(shù)據(jù)進(jìn)行分析查詢,例如,用來計(jì)算趨勢(shì)或者網(wǎng)站的日志。Hive不應(yīng)該用來進(jìn)行實(shí)時(shí)的查詢。因?yàn)樗枰荛L時(shí)間才可以返回結(jié)果。
Hbase非常適合用來進(jìn)行大數(shù)據(jù)的實(shí)時(shí)查詢。Facebook用Hive進(jìn)行消息和實(shí)時(shí)的分析。它也可以用來統(tǒng)計(jì)Facebook的連接數(shù)。