Hive。。
什么是hive?
1、hive是一個(gè)運(yùn)行在分布式應(yīng)用程序上的一個(gè)數(shù)據(jù)倉庫管理工具
2、hive可以將hdfs上的具有結(jié)構(gòu)的文件映射成一張表,,并且提供了類sql的語法來管理和分析這些表(本質(zhì)就是hdfs上的文件)
3、用于描述文件和表的映射關(guān)系的數(shù)據(jù)叫做元數(shù)據(jù),存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中(mysql,oracle等)
4、默認(rèn)情況下執(zhí)行引擎為mapreduce(還有spark等)
hive是干什么的?
1、hive是一個(gè)運(yùn)行在分布式應(yīng)用程序上的一個(gè)數(shù)據(jù)倉庫管理工具
2、hive可以將hdfs上的具有一定結(jié)構(gòu)的文件映射成一張表,,并且提供了類sql的語法來管理和分析這些表(本質(zhì)就是hdfs上的文件)
為什么要使用hive?
1、直接使用mapreduce的話,代碼復(fù)雜度要高得多,而且人員學(xué)習(xí)成本高
2、項(xiàng)目周期要求短
3、mapreduce實(shí)現(xiàn)復(fù)雜查詢邏輯開發(fā)難度大
hive的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、學(xué)習(xí)成本低
提供了類sql查詢語言,(簡單,容易上手),避免直接寫mapreduce(適合java不好,sql熟練),減少開發(fā)人員 的學(xué)習(xí)成本。
2、可擴(kuò)展性好
hive運(yùn)行在分布式應(yīng)用程序上,分布式集群的擴(kuò)展性是很好的
3、適合做離線分析處理(OLAP)
· hive延遲較高
4、延展性好
hive可以自定義函數(shù)
5、良好的容錯(cuò)性
基于分布式應(yīng)用程序
6、統(tǒng)一管理
提供了統(tǒng)一的元數(shù)據(jù)管理,將元數(shù)據(jù)存儲(chǔ)到關(guān)系型數(shù)據(jù)庫中(mysql,oracle等)
缺點(diǎn)
1、hql的表達(dá)能力有限
2、hive本身底層是mapreduce
hive自動(dòng)生成的mapreduce作業(yè),通常情況下不夠智能化
hive調(diào)優(yōu)比較困難
3、延遲比較高,不適合OLTP
hive的架構(gòu)和原理
hive的架構(gòu)簡介
hive的體系結(jié)構(gòu)分為以下幾部分:
第一層:指的是連接hive的客戶端接口層
- CLI (command line interface),指的是hive提供的shell命令(hive -e hive -f hive - i )
- JDBC/ODBC,指的是可以使用編程語言來來連接hive.比如,java,c++,ruby等
- webui, hive提供了web訪問接口
第二層:
- thrift server :第三方軟件服務(wù)項(xiàng)框架,當(dāng)使用遠(yuǎn)程方式連接時(shí),需要使用這個(gè)服務(wù)。
- 元數(shù)據(jù)存儲(chǔ): 指的是元數(shù)據(jù)存儲(chǔ)的位置,可以是mysql,oracle,derby等
第三層:驅(qū)動(dòng)層
- 解析器(SQLParser):
作用就是解析語法的正確性,比如表是否存在、字段是否存在、SQL語義是否有誤。
- 編譯器(Compiler):
作用就是將正確的語法翻譯成mr程序,會(huì)與元數(shù)據(jù)庫進(jìn)行交互,獲取對(duì)應(yīng)的元數(shù)據(jù),比如表名對(duì)應(yīng)的文件路徑。
最后形成job程序
- 優(yōu)化器(Optimizer):
將執(zhí)行計(jì)劃進(jìn)行優(yōu)化,減少不必要的列、使用分區(qū)、使用索引等。優(yōu)化job。
- 執(zhí)行器(Executer):
將優(yōu)化后的執(zhí)行計(jì)劃提交給hadoop的yarn上執(zhí)行。提交job。
hive的工作流程
7.1 與此同時(shí),在執(zhí)行時(shí),執(zhí)行引擎可以通過Metastore執(zhí)行元數(shù)據(jù)操作(比如,create…as select操作)
hive與mpreduce的區(qū)別、
hive的底層就是mapreduce,hive就是對(duì)mapreduce的封裝。
hive與傳統(tǒng)型數(shù)據(jù)庫的區(qū)別
Hive和數(shù)據(jù)庫的比較如下表:
| ANSI SQL | 支持 | 不完全支持 |
| 更新 | UPDATE INSERT DELETE | INSERT OVERWRITE\ INTO TABLE |
| 事務(wù) | 支持 | 支持(部分支持) |
| 模式 | 寫模式 | 讀模式 |
| 存儲(chǔ)位置 | 塊設(shè)備、本地文件系統(tǒng) | HDFS |
| 延時(shí) | 低 | 高 |
| 多表插入 | 不支持 | 支持 |
| 子查詢 | 完全支持 | 只能用在From子句中 |
| 視圖 | Updatable | Read-only |
| 可擴(kuò)展性 | 低 | 高 |
| 數(shù)據(jù)規(guī)模 | 小 | 大 |
| 實(shí)時(shí)響應(yīng) | 毫秒級(jí) | 秒級(jí) |
hive的安裝
這里只寫本地模式安裝和遠(yuǎn)程模式安裝
1、將hive和mysql安裝包上傳,解壓,更名,并且配置環(huán)境變量
2、因?yàn)榘惭b的是完全分布式,所以需要安裝mysql
3、設(shè)置hive-env.sh
export HIVE_CONF_DIR=/usr/local/hive/conf export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop export HIVE_AUX_JARS_PATH=/usr/local/hive/lib4、設(shè)置hive-site.xml(conf里原來是沒有hive-site.xml的,只需要復(fù)制hive-default.xml就行)
<!--hive倉庫在hdfs的位置--> <property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value> </property><!-- 該參數(shù)主要指定Hive的臨時(shí)文件存儲(chǔ)目錄 --> <property><name>hive.exec.scratchdir</name><value>/tmp/hive</value> </property> <!-- 刪除所有的內(nèi)容,只需要配置一下四個(gè)即可 --> <property><name>hive.exec.local.scratchdir</name><value>/usr/local/hive/iotmp/root</value> </property> <property><name>hive.downloaded.resources.dir</name><value>/usr/local/hive/iotmp/${hive.session.id}_resources</value> </property> <property><name>hive.querylog.location</name><value>/usr/local/hive/iotmp/root</value> </property> <property><name>hive.server2.logging.operation.log.location</name><value>/usr/local/hive/iotmp/root/operation_logs</value> </property><!-- 配置metastore服務(wù)項(xiàng)連接mysql的參數(shù) --><!--配置mysql的連接字符串--> <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value> </property> <!--配置mysql的連接驅(qū)動(dòng)--> <property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value> </property> <!--配置登錄mysql的用戶--> <property><name>javax.jdo.option.ConnectionUserName</name><value>root</value> </property> <!--配置登錄mysql的密碼--> <property><name>javax.jdo.option.ConnectionPassword</name><value>@Mm123123</value> </property>5、初始化元數(shù)據(jù)庫mysql
schematool -initSchema -dbType mysql初始化之后就可以在本地運(yùn)行hive了。
啟動(dòng)hive的命令:
hive命令會(huì)內(nèi)置啟動(dòng)metastore服務(wù)來連接關(guān)系型數(shù)據(jù)庫獲取元數(shù)據(jù)。
hive的遠(yuǎn)程模式
遠(yuǎn)程模式的簡介
遠(yuǎn)程模式就是hive中的相關(guān)進(jìn)程,比如metastore和hiveserver2這樣的進(jìn)程單獨(dú)開啟,使用客戶端或者命令行進(jìn)行遠(yuǎn)程連接這兩個(gè)服務(wù),就是遠(yuǎn)程模式。客戶端可以再任何機(jī)器上,只要這臺(tái)機(jī)器連接到開啟了服務(wù)的服務(wù)器上,就可以進(jìn)行操作。
服務(wù)端的配置
1、hive-site.xml
hive-site.xml和本地的配置一模一樣,如果在本地模式基礎(chǔ)上設(shè)置,hive-site.xml是不用變的。
2、使用遠(yuǎn)程模式的話,需要配置hadoop的core-site.xml,添加下面兩個(gè)屬性
hive的兩種服務(wù)說明
第一種服務(wù):hiveserver2
1. 該服務(wù)端口號(hào)默認(rèn)是10000 2. 可以單獨(dú)啟動(dòng)此服務(wù)進(jìn)程,供遠(yuǎn)程客戶端連接;此服務(wù)內(nèi)置metastore服務(wù)。 3. 啟動(dòng)方式:方法1:直接調(diào)用hiveserver2。會(huì)進(jìn)入監(jiān)聽狀態(tài)不退出。方法2:hive --service hiveserver2 & 進(jìn)入后臺(tái)啟動(dòng)方法3:hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。第二種服務(wù):metastore
1. 此服務(wù)才是真正連接元數(shù)據(jù)庫的服務(wù)進(jìn)程 2. 也可以讓遠(yuǎn)程客戶端連接 3. 啟動(dòng)方式:方法1:- hive --service metastore &方法2:- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。客戶端連接hiveserver2服務(wù)
說明:
-1. 連接此服務(wù)的hive客戶端,只需要配好環(huán)境變量即可 -2. 只能使用hive中的beeline連接工具進(jìn)行連接此服務(wù),beeline是hive的一個(gè)輕量級(jí)的連接客戶端工具。連接方式:
方式1:step1. beeline 回車step2. !connect jdbc:hive2://qianfeng02:10000 回車step3. 輸入用戶名 回車step4. 輸入密碼 回車 方法2(直連):1. beeline -u jdbc:hive2://qianfeng02:10000 -n 用戶名解析: hive2,是hive的協(xié)議名稱ip: hiveserver2服務(wù)所在的主機(jī)IP。10000,是hiveserver2的端口號(hào)客戶端連接metastore服務(wù)
注意:想要連接metastore服務(wù)的客戶端必須配置如下屬性和屬性值
<property><name>hive.metastore.uris</name> <value>thrift://qianfeng02:9083</value> </property>解析:thrift:是協(xié)議名稱ip為metastore服務(wù)所在的主機(jī)ip地址9083是默認(rèn)端口號(hào)Hive基本操作-庫、表
規(guī)則
大小寫規(guī)則:
1. hive的數(shù)據(jù)庫名、表名都不區(qū)分大小寫 2. 建議關(guān)鍵字大寫命名規(guī)則:
1. 名字不能使用數(shù)字開頭 2. 不能使用關(guān)鍵字 3. 盡量不使用特殊符號(hào)庫操作語法
創(chuàng)建數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫的本質(zhì)就是在hive的參數(shù)${hive.metastore.warehouse.dir}對(duì)應(yīng)的目錄下創(chuàng)建一個(gè)新的目錄,此目錄的名稱格式為:庫名.db
注意:在創(chuàng)建庫或者表時(shí)除了創(chuàng)建目錄外,還會(huì)在元數(shù)據(jù)庫中添加元數(shù)據(jù)信息(描述信息)描述信息可以在關(guān)系型數(shù)據(jù)庫中查看,也可以在hive命令行使用 desc extended tableName來查看
** 查看所有數(shù)據(jù)庫**
語法:show databases;** 切換數(shù)據(jù)庫**
語法:use mydb;** 查看數(shù)據(jù)庫信息**
語法1:desc database databaseName; 語法2:desc database extended databaseName; 語法3:describe database extended databaseName;** 刪除數(shù)據(jù)庫**
語法1:drop database databasename; #這個(gè)只能刪除空庫 語法2:drop database databasename cascade; #如果不是空庫,則可以加cascade強(qiáng)制刪除表操作語法
數(shù)據(jù)類型
Hive的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型,下面是基本數(shù)據(jù)類型(復(fù)雜類型到后期再講)
其中加粗體是重點(diǎn)要掌握的類型
| 基本類型 | BOOLEAN | true/false | TRUE |
| TINYINT | 1字節(jié)的有符號(hào)整數(shù) -128~127 | 1Y | |
| SMALLINT | 2個(gè)字節(jié)的有符號(hào)整數(shù),-32768~32767 | 1S | |
| INT | 4個(gè)字節(jié)的帶符號(hào)整數(shù) | 1 | |
| BIGINT | 8字節(jié)帶符號(hào)整數(shù) | 1L | |
| FLOAT | 4字節(jié)單精度浮點(diǎn)數(shù) | 1.0 | |
| DOUBLE | 8字節(jié)雙精度浮點(diǎn)數(shù) | 1.0 | |
| DEICIMAL | 任意精度的帶符號(hào)小數(shù) | 1.0 | |
| STRING | 字符串,可變長度 | “a”,’b’ | |
| VARCHAR | 變長字符串,要設(shè)置長度 | “a”,’b’ | |
| CHAR | 固定長度字符串 | “a”,’b’ | |
| BINARY | 字節(jié)數(shù)組 | 無法表示 | |
| TIMESTAMP | 時(shí)間戳,納秒精度 | 122327493795 | |
| DATE | 日期 | ‘2016-03-29’ | |
| 復(fù)雜類型 | ARRAY | 有序的的同類型的集合 | array(1,2) |
| MAP | key-value,key必須為原始類型,value可以任意類型 | map(‘a(chǎn)’,1,’b’,2) | |
| STRUCT | 字段集合,類型可以不同 | struct(‘1’,1,1.0) | |
| UNION | 在有限取值范圍內(nèi)的一個(gè)值 | create_union(1,’a’,63) |
** 創(chuàng)建表**
創(chuàng)建表的本質(zhì)其實(shí)就是在對(duì)應(yīng)的數(shù)據(jù)庫目錄下面創(chuàng)建一個(gè)子目錄,目錄名為表名。數(shù)據(jù)文件就存在這個(gè)目錄下。
語法1: create table t_user(id int,name string); 語法2:使用庫.表的形式create table mydb.t_user(id int,name string);語法3:指定分隔規(guī)則形式 create table if not exists t1( uname string comment 'this is name', chinese int, math int, english int ) comment 'this is my table' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;查看當(dāng)前表空間中的所有表名
語法:show tables; # 查看另外一個(gè)數(shù)據(jù)庫中的表 show tables in zoo;查看表結(jié)構(gòu)
desc tableName desc extended tableName; describe extended tableName;** 修改表結(jié)構(gòu)**
- 修改表名alter table oldTableName rename to newTableName;- 修改列名:change column alter table tableName change column oldName newName colType; - 修改字段類型:alter table tableName change column colName colName colType;- 修改列的位置: 注意,2.x版本后,必須是相同類型進(jìn)行移動(dòng)位置。alter table tableName change column colName colName colType after colName1; alter table tableName change column colName colName colType first;- 增加字段:add columnsalter table tableName add columns (sex int,...);- 刪除字段:replace columns #注意,2.x版本后,注意類型的問題,替換操作,其實(shí)涉及到位置的移動(dòng)問題。alter table tableName replace columns(id int,name int,size int,pic string);注意:實(shí)際上是保留小括號(hào)內(nèi)的字段。** 刪除表**
drop table tableName;擴(kuò)展)建表語法
下面是一個(gè)常見的創(chuàng)建表的語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] TABLENAME( [COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...]) [COMMENT 'TABLE COMMENT'] [PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)] [CLUSTERED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...) [SORTED BY (COLUMNNAME [ASC|DESC])...] INTO NUM_BUCKETS BUCKETS] [ROW FORMAT ROW_FORMAT] [STORED AS FILEFORMAT] [LOCATION HDFS_PATH];如果要看完整的創(chuàng)建表語法,可以參考下面完整創(chuàng)建表語句:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])][COMMENT table_comment][PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)][CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)] ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES][ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later) ][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)其中具體創(chuàng)建表的參數(shù)類型可以參考如下:
data_type: primitive_type| array_type| map_type| struct_type| union_type -- (Note: Available in Hive 0.7.0 and later)primitive_type: TINYINT| SMALLINT| INT| BIGINT| BOOLEAN| FLOAT| DOUBLE| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)| STRING| BINARY -- (Note: Available in Hive 0.8.0 and later)| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)| DECIMAL -- (Note: Available in Hive 0.11.0 and later)| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)| DATE -- (Note: Available in Hive 0.12.0 and later)| VARCHAR -- (Note: Available in Hive 0.12.0 and later)| CHAR -- (Note: Available in Hive 0.13.0 and later)array_type: ARRAY < data_type >map_type: MAP < primitive_type, data_type >struct_type: STRUCT < col_name : data_type [COMMENT col_comment], ...>union_type: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)row_format: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]file_format:: SEQUENCEFILE| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)| RCFILE -- (Note: Available in Hive 0.6.0 and later)| ORC -- (Note: Available in Hive 0.11.0 and later)| PARQUET -- (Note: Available in Hive 0.13.0 and later)| AVRO -- (Note: Available in Hive 0.14.0 and later)| JSONFILE -- (Note: Available in Hive 4.0.0 and later)| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classnamecolumn_constraint_specification:: [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]default_value:: [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] constraint_specification:: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ][, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]數(shù)據(jù)導(dǎo)入
[root@qianfeng01 hive]# mkdir /hivedata [root@qianfeng01 hive]# cd /hivedata [root@qianfeng01 hive]# vi user.txt -- 加入下面的徐盛數(shù)據(jù) 1,廉德楓 2,劉浩 3,王鑫 4,司翔加載數(shù)據(jù)到Hive,一般分為兩種:
- 一種是從本地Linux上加載到Hive中 - 另外一種是從HDFS加載到Hive中**方法1:**使用hdfs dfs -put將本地文件上傳到表目錄下
hdfs dfs -put ./u1.txt /user/hive/warehouse/mydb1.db/u1**方法2:**在hive中使用load 命令
load data [local] inpath '文件路徑' [overwrite] into table 表名加載數(shù)據(jù)時(shí): 1. 最好是寫絕對(duì)路徑,從根開始寫。 2. 寫相對(duì)路徑也是可以的,但是一定要記住你登錄hive時(shí)的位置,從當(dāng)前位置寫相對(duì)路徑 3. ~在hive中,是相對(duì)路徑的寫法 4. 使用benline工具進(jìn)行遠(yuǎn)程登錄(客戶端與服務(wù)端不在同一臺(tái)機(jī)器)時(shí),使用以下語句時(shí):load data local inpath '文件路徑' [overwrite] into table 表名會(huì)有一個(gè)大坑:local是指服務(wù)端的文件系統(tǒng)。**方法3:**從另外一張表(也可稱之為備份表)中動(dòng)態(tài)加載數(shù)據(jù)
insert into table tableName2 select [.....] from tableName1;擴(kuò)展內(nèi)容:向多張表中插入數(shù)據(jù)的語法from tableName1insert into tableName2 select * where 條件insert into tableName3 select * where 條件.....注意: tableName2表中的字段個(gè)數(shù)必須和tableName1表中查詢出來的個(gè)數(shù)相同
**方法4:**克隆表數(shù)據(jù)
- create table if not exists tableName2 as select [....] from tableName1; - create table if not exists tableName2 like tableName1 location 'tableName1的存儲(chǔ)目錄的路徑'擴(kuò)展內(nèi)容:只復(fù)制表結(jié)構(gòu) create table if not exists tableName2 like tableName1;加載數(shù)據(jù)的本質(zhì):
注意:hive使用的是嚴(yán)格的讀時(shí)模式:加載數(shù)據(jù)時(shí)不檢查數(shù)據(jù)的完整性,讀時(shí)發(fā)現(xiàn)數(shù)據(jù)不對(duì)則使用NULL來代替。
而mysql使用的是寫時(shí)模式:在寫入數(shù)據(jù)時(shí)就進(jìn)行檢查
案例演示
CREATE TABLE flow( id string COMMENT 'this is id column', phonenumber string, mac string, ip string, url string, urltype string, uppacket int, downpacket int, upflow int, downflow int, issuccess int ) COMMENT 'this is log table' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' stored as textfile;加載數(shù)據(jù): load data local inpath './data/HTTP_20130313143750.dat' into table flow;1、統(tǒng)計(jì)每個(gè)電話號(hào)碼的總流量(M) select l.phonenumber, round(sum(l.upflow + l.downflow) / 1024.0,2) as total from log1 l group by l.phonenumber ;2、第二個(gè)需求,求訪問次數(shù)排名前3的url: select l.url url, count(l.url) as urlcount from log1 l group by l.url order by urlcount desc limit 3 ;數(shù)據(jù)導(dǎo)出
hive數(shù)據(jù)導(dǎo)出分類
1. 從hive表中導(dǎo)出本地文件系統(tǒng)中(目錄、文件) 2. 從hive表中導(dǎo)出hdfs文件系統(tǒng)中 3. hive表中導(dǎo)出到其它hive表中導(dǎo)出到目錄下
--1. 導(dǎo)出數(shù)據(jù)到本地文件系統(tǒng)的目錄下 insert overwrite local directory '/root/out/00' select * from student;--2. 導(dǎo)出數(shù)據(jù)到hdfs的目錄下 insert overwrite directory '/root/out/01' select * from student;-- 導(dǎo)出的文件中字段默認(rèn)不分隔。直接導(dǎo)入到本地文件系統(tǒng)的文件中:
[root@qianfeng01 ~]# hive -e 'select * from exercise.student' >> /root/out/02; -- 導(dǎo)出的文件中字段分隔符默認(rèn)是\t修改導(dǎo)出后的列與列之間的格式:
insert overwrite local directory '/root/out/01' row format delimited fields terminated by ',' select * from student;表類型詳解
表分類
在Hive中,表類型主要分為兩種,
第一種:內(nèi)部表
- 也叫管理表 - 表目錄會(huì)創(chuàng)建在集群上的{hive.metastore.warehouse.dir}下的相應(yīng)的庫對(duì)應(yīng)的目錄中。 - 默認(rèn)創(chuàng)建的表就是內(nèi)部表第二種:外部表
- 外部表需要使用關(guān)鍵字"external", - 外部表會(huì)根據(jù)創(chuàng)建表時(shí)LOCATION指定的路徑來創(chuàng)建目錄, - 如果沒有指定LOCATION,則位置跟內(nèi)部表相同,一般使用的是第三方提供的或者公用的數(shù)據(jù)。 - 建表語法:必須指定關(guān)鍵字external。create external table tableName(id int,name string) [location 'path'];內(nèi)部表和外部表轉(zhuǎn)換:
內(nèi)部表轉(zhuǎn)外部表
alter table tableName set tblproperties('EXTERNAL'='TRUE'); 注意:內(nèi)部表轉(zhuǎn)外部表,true一定要大寫;外部表轉(zhuǎn)內(nèi)部表
alter table tableName set tblproperties('EXTERNAL'='false'); 說明:false不區(qū)分大小兩者之間區(qū)別
1) 內(nèi)部表和外部表在創(chuàng)建時(shí)的差別
就差兩個(gè)關(guān)鍵字,EXTERNAL 和 LOCATION
舉例:
2) Hive表創(chuàng)建時(shí)要做的兩件事:
在hdfs下創(chuàng)建表目錄
在元數(shù)據(jù)庫mysql創(chuàng)建相應(yīng)表的描述數(shù)據(jù)(元數(shù)據(jù))
3) drop時(shí)有不同的特性:
1、drop時(shí),元數(shù)據(jù)都會(huì)被清除
2、drop時(shí),內(nèi)部表的表目錄會(huì)被刪除,但是外部表的表目錄不會(huì)被刪除。
4) 使用場景
內(nèi)部表: 平時(shí)用來測試或者少量數(shù)據(jù),并且自己可以隨時(shí)修改刪除數(shù)據(jù).
外部表:使用后數(shù)據(jù)不想被刪除的情況使用外部表(推薦使用)所以,整個(gè)數(shù)據(jù)倉庫的最底層的表使用外部表
Hive Shell技巧
查看所有hive參數(shù)
# 在hive命令行直接輸入set 即可 hive> set只執(zhí)行一次Hive命令
通過shell的參數(shù) -e 可以執(zhí)行一次就運(yùn)行完的命令
[root@qianfeng01 hive]# hive -e "select * from cat"小技巧2:可以通過外部命令快速查詢某個(gè)變量值:
hive -S -e “set” |grep cli.print
-S 是靜默模式,會(huì)省略到多余的輸出
單獨(dú)執(zhí)行一個(gè)sql文件
通過參數(shù)-f +file文件名就可以,經(jīng)常用在以后的sql文件單獨(dú)執(zhí)行,導(dǎo)入數(shù)據(jù)場景中
[root@qianfeng01 hive]# hive -f /path/cat.sql小技巧:在shell內(nèi)部 可以通過source命令來執(zhí)行一個(gè)sql
執(zhí)行Linux命令
在Hive的shell中 加上前綴! 最后以分號(hào);結(jié)尾,可以執(zhí)行l(wèi)inux的命令
hive> ! pwd ;執(zhí)行HDFS命令
用戶可以在Hive的shell中執(zhí)行HDFS的DFS命令,不用敲入前綴hdfs或者h(yuǎn)adoop
hive> dfs -ls /tmp使用歷史命令和自動(dòng)補(bǔ)全
在Hive的Shell操作中可以使用上下箭頭查看歷史記錄
如果忘記了命令可以用tab鍵進(jìn)行補(bǔ)全
顯示當(dāng)前庫:
下面是通過配置文件hive-site.xml顯示
<property><name>hive.cli.print.current.db</name><value>false</value><description>Whether to include the current database in the Hive prompt.</description> </property>當(dāng)前session里設(shè)置該參數(shù):
hive> set hive.cli.print.current.db=true;查看當(dāng)前參數(shù)設(shè)置的值:
小技巧1:可以在shell中輸入set命令,可以看到hive已經(jīng)設(shè)定好的參數(shù)
hive> set hive.cli.print.current.db;Hive基本查詢語法
基本使用規(guī)則
6.1.1 基本查詢語句組成
select .. from ..join [tableName] on ..where ..group by ..having ..order by ..sort by ..limit .. union | union all ...6.1.2 執(zhí)行順序
第一步: FROM <left_table> 第二步: ON <join_condition> 第三步: <join_type> JOIN <right_table> 第四步: WHERE <where_condition> 第五步: GROUP BY <group_by_list> 第六步: HAVING <having_condition> 第七步: SELECT 第八步: DISTINCT <select_list> 第九步: ORDER BY <order_by_condition> 第十步: LIMIT <limit_number>標(biāo)準(zhǔn)sql語句的一些規(guī)則: -1. 列別名的使用,必須完全符合執(zhí)行順序,不能提前使用。(mysql除外) -2. 在分組查詢時(shí),select子句中只能含有分組字段和聚合函數(shù),不能有其他普通字段。(mysql除外)6.1.3 查詢?cè)瓌t
1. 盡量不使用子查詢、盡量不使用in 或者not in (可以使用 [not] exists替代) 2. 盡量避免join連接查詢,但是通常避免不了 3. 查詢永遠(yuǎn)是小表驅(qū)動(dòng)大表(小表作為驅(qū)動(dòng)表)--注意:內(nèi)連接時(shí),默認(rèn)是左表是驅(qū)動(dòng)表,因此左表一定要是小表。-- 外連接看需求而定。6.2 常用子句回顧
6.2.1 where語句特點(diǎn)
where后不能使用聚合函數(shù),可以使用子查詢,也可以是普通函數(shù)。 條件可以是: 1. 關(guān)系表達(dá)式: =, >,>=,<,<=,!=,<> 2. 連接符號(hào): or,and, between .. and .. 3. 模糊查詢: like %:通配符_:占位符 4. [not] in>all(set) >any();注意事項(xiàng):在hive的where中如果使用了子查詢作為條件,等號(hào)“=”不好使,需要使用[not] in.換句話說,即使子查詢返回的是唯一的一個(gè)值,也是集合形式。6.2.2 group by語句特點(diǎn)
group by: 分組,通常和聚合函數(shù)搭配使用查詢的字段要么出現(xiàn)在group by 后面,要么出現(xiàn)在聚合函數(shù)里面聚合函數(shù):count(),sum(),max(),min(),avg()count的執(zhí)行 1. 執(zhí)行效果上:- count(*)包括了所有的列,相當(dāng)于行數(shù),在統(tǒng)計(jì)結(jié)果的時(shí)候不會(huì)忽略null值- count(1)包括了所有列,用1代表行,在統(tǒng)計(jì)結(jié)果的時(shí)候也不會(huì)忽略null值- count(列名)只包括列名那一列,在統(tǒng)計(jì)結(jié)果時(shí),會(huì)忽略null值2.執(zhí)行效率上:- 列名為主鍵,count(列名)會(huì)比count(1)快- 列名不為主鍵,count(1)會(huì)比count(列名)快- 如果表中有多個(gè)列并且沒有主鍵,count(1)的效率高于count(*)- 如果有主鍵count(主鍵)效率是最高的- 如果表中只有一個(gè)字段count(*)效率最高6.2.3 having子句特點(diǎn)
對(duì)分組以后的結(jié)果集進(jìn)行過濾。可以使用聚合函數(shù)。6.2.4 order by子句
對(duì)查詢的數(shù)據(jù)進(jìn)行排序。 desc 降序 asc 升序語法: order by colName [desc|asc][,colName [desc|asc]]6.2.5 limit語句特點(diǎn)
limit : 從結(jié)果集中取數(shù)據(jù)的條數(shù) 將set hive.limit.optimize.enable=true 時(shí),limit限制數(shù)據(jù)時(shí)就不會(huì)全盤掃描,而是根據(jù)限制的數(shù)量進(jìn)行抽樣。同時(shí)還有兩個(gè)配置項(xiàng)需要注意: hive.limit.row.max.size 這個(gè)是控制最大的抽樣數(shù)量 hive.limit.optimize.limit.file 這個(gè)是抽樣的最大文件數(shù)量注意:limit 在mysql中 可以有兩個(gè)參數(shù) limit [m,] n在hive中,只能有一個(gè)參數(shù) limit n; 查詢前n條。一般情況下,在使用limit時(shí),都會(huì)先order by排序。6.2.6 union | union all
union all:將兩個(gè)或者多個(gè)查詢的結(jié)果集合并到一起。不去重 union:將兩個(gè)或者多個(gè)查詢的結(jié)果集合并到一起,去重合并后的數(shù)據(jù)并排序 union語句字段的個(gè)數(shù)要求相同,字段的順序要求相同。join連接
總結(jié)
- 上一篇: 百度贴吧的图片爬取
- 下一篇: 做SEO:量变引起质变才是真理