Hive Shell
目錄
hive是否執行mr
創建數據庫指定目錄
刪除數據庫
?顯示表信息/表結構
查看表示內部表還是外部表?
拷貝一張已經存在的表的表模式(而無需拷貝數據)
復制一張表(包括數據)
?hive-cli 顯示當前所在數據庫
執行命令不進入hive交互模式
hive關聯hbase表
創建外部表
查詢數據保存到linux系統
創建內部表
創建parquet格式snappy壓縮表
外部執行
清空表中所有行數據
導入數據
1.將文件放入表目錄下
2.導入本地文件直接導入表中
3.導入hdfs上數據到表中
4.從別的表中查詢插入相應的表
5.在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中
UDF
Hive執行引擎設置
Hive指定yarn隊列
多表插入
Hive手動創建目錄導入數據,表刷新partition
hive是否執行mr
簡單的查詢,就是只是select,不帶count,sum,group by這樣的,都不走map/reduce,直接讀取hdfs文件進行filter過濾。這樣做的好處就是不新開mr任務,執行效率要提高不少,但是不好的地方就是用戶界面不友好,有時候數據量大還是要等很長時間,但是又沒有任何返回。 改這個很簡單,在hive-site.xml里面有個配置參數叫 hive.fetch.task.conversion 將這個參數設置為more,簡單查詢就不走map/reduce了,設置為minimal,就任何簡單select都會走map/reduce創建數據庫指定目錄
hive> CREATE DATABASE financials> LOCATION '/my/preferred/directory'> COMMENT 'Holds all financial tables'刪除數據庫
hive> DROP DATABASE IF EXISTS financialsIF EXISTS子句是可選的,如果加了這個子句,就可以避免因數據庫finanacials不存在而拋出警告信息默認情況下,Hive是不允許用戶刪除一個包含有表的數據庫的。用戶要么先刪除數據庫中的表,然后再刪除數據庫;要么在刪除命令的最后面加上關鍵字CASCADE,這樣可以使Hive自行先刪除數據庫中的表:hive> DROP DATABASE IF EXISTS financials CASCADE?顯示表信息/表結構
hive > DESCRIBE FORMATTED mydb.tableNameFORMATTED 詳細表結構查看表示內部表還是外部表?
hive> DESCRIBE extended crawler_hive2; 內部表: tableType:MANAGED_TABLE 外部表:ableType:EXTERNAL_TABLE拷貝一張已經存在的表的表模式(而無需拷貝數據)
CREATE TABLE IF NOT EXISTS mydb.employees2 LIKE mydb.employees LOCATION 'xxxx/xxx/xxx'復制一張表(包括數據)
create table t_copy as select * from t_temp;?
?hive-cli 顯示當前所在數據庫
hive> set hive.cli.print.current.db=true; hive (ods_database)>取消顯示 set hive.cli.print.current.db=false;執行命令不進入hive交互模式
hive -e "SQL" 執行單條語句 hive -f /home/root/insert.sql 執行sql文件,適合多條語句hive關聯hbase表
hive集成hbase:
hive 0.13版本 hbase1.2.5版本無法創建hive創建內部表關聯,提示找不到方法,hive更新到2.1.1版本就可以了
- hive創建外部表關聯(可以關聯hbase已有的表)
- hive創建內部表關聯(只能關聯hbase中沒有的表,刪除hive表后hbase表也會刪除,并且通過hive創建hbase的內部表,存儲數據仍然存在hbse中)
創建外部表
create EXTERNAL TABLE u_info (usrid STRING,age STRING,sex STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';查詢數據保存到linux系統
insert overwrite local directory '/home/xxx/xxx' select * from tableName;?
創建內部表
create TABLE u_info (usrid STRING,age STRING,sex STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n';創建parquet格式snappy壓縮表
CREATE EXTERNAL TABLE IF NOT EXISTS tableName(xxx string)
partitioned by
(pt_xvc string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
STORED AS PARQUET TBLPROPERTIES('parquet.compression'='SNAPPY');
?
外部執行
hive -f xxx.sql
清空表中所有行數據
truncate table tablename;導入數據
1.將文件放入表目錄下
- 表創建時會指定列分隔符(默認'\t')和行分隔符(默認'\n')
- 將數據以指定形式放入,hive在hdfs存儲目錄下
測試導入數據如下(a.txt里內容):
user1 27 1 user2 28 1 user3 29 0 user4 30 1 user5 31 0 user6 32 1 user7 33 1 user8 34 0 我 是 測試 外 部 表- 步驟:
- 用上面創建表命令創建一個內部或者外部表
- 將a.txt里的內容導入到hdfs該表的目錄下
- select * from u_info;即可查詢到數據
- 如果有兩個txt,查詢時會合并到一起
2.導入本地文件直接導入表中
測試導入數據a.txt
load data local inpath 'a.txt' into table u_info;- a.txt,文件路徑默認是用戶的根目錄,如root用戶,讀取目錄為/home/root/a.txt
- 推薦寫絕對路徑
- 在hive中可以直接查看hdfs上的數據,使用命令:
3.導入hdfs上數據到表中
測試導入數據a.txt
load data inpath '/a.txt' into table u_info;- 與2中的區別是少了一個 local
4.從別的表中查詢插入相應的表
- 創建表 test 并且以age進行分區
- 查詢另一個表的數據并且插入到test表
這里做一下說明: 我們知道我們傳統數據塊的形式insert into table values(字段1,字段2),這種形式hive是不支持的。
- 我們也可以在select語句里面通過使用分區值來動態指明分區:
這種方法叫做動態分區插入,但是Hive中默認是關閉的,所以在使用前需要先把hive.exec.dynamic.partition.mode設置為nonstrict
5.在創建表的時候通過從別的表中查詢出相應的記錄并插入到所創建的表中
- 在實際情況中,表的輸出結果可能太多,不適于顯示在控制臺上,這時候,將Hive的查詢輸出結果直接存在一個新的表中是非常方便的,我們稱這種情況為CTAS(create table .. as select)如下:
UDF
- UDFClass
maven引用
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.1</version></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version></dependency>- 在hive交互界面輸入
- 使用函數查詢后結果
- 不使用函數結果
- 使用hive -i 參數在進入hive時自動初始化
和前兩者相比,第三種方式直接將用戶的自定義函數作為注冊為內置函數,未來使用起來非常簡單,但這種方式也非常危險,一旦出錯,將是災難性的,因此,建議如果不是特別通用,并且固化下來的函數,還是使用前兩種方式比較靠譜。
Hive執行引擎設置
set hive.execution.engine=mr;Hive指定yarn隊列
set mapred.job.queue.name=queue3;多表插入
FROM tableName1 INSERT OVERWRITE TABLE tableName2SELECT column1,colum2 GROUP BY year INSERT OVERWRITE TABLE tableName3SELECT column1,count(1)WHERE column2 = 100- CTAS(CREATE TABLE... AS SELECT) 把查詢到的結果創建一個新表保存起來,原子性操作,查詢失敗表不會被創建
Hive手動創建目錄導入數據,表刷新partition
alter table crawler_other_article_hive add partition(created_date=201801) location 'hdfs://xxx:8020/user/hive/warehouse/ods_crawler.db/crawler_other_article_hive/created_date=201801';刪除表分區 ALTER TABLE testc DROP PARTITION (pt_date=20181212)?
總結
以上是生活随笔為你收集整理的Hive Shell的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive 禁止提交 大范围磁盘扫描任务(
- 下一篇: Kafka 集群数据备份 MirrorM