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元開房?「佛系」大數據為何舉起殺熟的刀
《數據架構》閱讀筆記(六)數據架構

TAG:大數據 | Hive | Hadoop |