Hive那些事兒
查看hive 版本
locate */hive/lib/hive*jar
通常,hive-exec的那個jar包的版本就是hive的版本號
shell環境中直接執行hql文件
hive -f filename.hql
shell環境中直接執行簡單的hive查詢
hive -e "select * from table_name"
已靜默模式執行,並輸出結果到文件
hive -S -e "select * from table_name" > /tmp/result.txt
hive shell中直接執行hql
hive> source path/to/file/fiename.hql
hive shell中直接支持linux shell命令
hive> ! echo "what a lovely dog!";
hive> ! pwd;
hive查詢,垂直顯示類似於mysql的G;
!set outputformat vertical
select * from table limit 1;
use tmp;
create table tmp_20180427_employees(
name string,
salary float,
subordinates array<string>,
deductions map<string, float>,
address struct<street:string, city:string, state:string, zip:int>);
顯示當前全部資料庫
show databases;
如果沒有use 某個具體資料庫
默認是在default資料庫
用正則表達式顯示一部分資料庫
如以下表示:顯示所有h開頭的資料庫
show database like h.*
顯示某個資料庫具體信息
包括其所在hdfs/MapR 目錄
desc database database_name;
切換當前資料庫
use database_name;
刪除資料庫
DROP DATABASE IF EXISTS DATABASE_NAME;
默認情況下,Hive不允許用戶刪除有表的資料庫。
要麼先刪除表,在刪資料庫。
要麼在句尾加上CASCADE,這樣HIVE會自行先刪除資料庫中的表。
DROP DATABASE IF EXISTS DATABASE_NAME CASCADE;
copy一份已經存在的表,只是copy表模式,不是數據
create table if not exists mydb.employee2
like mydb.employee
顯示當前資料庫下所有的表
show tables;
顯示某個非當前資料庫中素有的表
show tables in database_name;
顯示某個表的欄位
加上extended就是詳細信息
包括創建者和創建時間等
desc/descibe (extended) table_name;
extended,輸出結果為長字元串,可讀性很差
用formatted代替extended,就能有很好的可讀性,垂直顯示
我們目前所創建的表都是所謂的管理表,也被稱為內部表。
因為這種表,hive會(或多或少)控制著數據的生命周期。
刪除內部表時,hive也會刪除表中的數據。
內部表不方便和其他工作(比如pig)共享數據
外部表的關鍵詞:EXERNAL
CREATE EXTERNAL TABLE IF NOT EXISTS stocks(
exchange STRING,
symbol STRING,
ymd STRING,
price_open FLOAT,
volume INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ,
LOCATION /data/stocks;
DESCRIBE EXTENDED TABLE_NAME;
可以看出是內部表還是外部表
-------以上內容,知乎專欄20180427已更新----------
Hive中的分區表,具有重要的性能優勢。
分區表還可以將數據以一種符合邏輯的方式進行組織,比如分層存儲。
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY(country STRING, state STRING);
可以將分區欄位理解成普通的欄位
只是用關鍵字PARTITIONED做區分
..../employees/country=CA/state=AB
..../employees/country=CA/state=BC
.....
..../employees/country=US/state=AL
..../employees/country=US/state=AK
....
分目錄存儲
對數據進行分區,也許最重要的目的就是為了更快的查詢
顯示所有分區
SHOW PARTITIONS table_name;
DESCRIBE EXTENDED TABLE_NAME;也能顯示出分區鍵
外部表同樣可以有分區
外部表+分區,這種結合給用戶提供了一個可以和其他工具共享數據
同時也可以優化查詢性能。
刪除表
DROP TABLE IF EXISTS employees;
如果是管理表,表的元數據信息和表內的數據都會被刪除
如果是外部表,表的元數據會被刪除,表中的數據不會被刪除
ALTER TABLE僅僅修改表元數據,表數據本身不會有任何修改。
表重命名
ALTER TABLE log_messages RENAME TO logmsgs;
增加分區
ALTER TABLE log_messages DD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION /logs/2011/01/01
PARTITION (year = 2011, month = 1, day = 2) LOCATION /logs/2011/01/02
PARTITION (year = 2011, month = 1, day = 3) LOCATION /logs/2011/01/03
刪除分區
ALTER TABLE log_messages DORP IF EXISTS PARTITION(year = 2011, month = 12, day = 2);
USE tmp;
CREATE TABLE IF NOT EXISTS tmp_20180428_lzj
( id INT,
name STRING,
birthday STRING,
gender STRING
);
修改列名稱和欄位屬性及所處位置
ALTER TABLE tmp_20180428_lzj
CHANGE COLUMN gender gend INT
COMMENT 性別
AFTER name;
gender是原名,gend是修改後的名字
如果想放第一行,可以將最後一行替換為FIRST
增加列
ALTER TABLE tmp_20180428_lzj ADD COLUMNS(
address STRING COMMENT location where person live,
company STRING );
--------------HiveQL 數據操作 ------
推薦閱讀:
※數字世界是如何被一群科學家和工程師創造出來的?——從《創新者》看創新
※一文讀懂物聯網、雲計算與大數據的關係
※別把我們的勞動,當作你們的資本——對用戶數據性質的新探討
※為啥熟客就要多花80元開房?「佛系」大數據為何舉起殺熟的刀
※《數據架構》閱讀筆記(六)數據架構