1. 程式人生 > >hive sql詳解

hive sql詳解

hive資料型別

hive基本資料型別

基本型別 大小(位元組) 描述
TINYINT 1 有符號整數
SMALLINT 2 有符號整數
INT 4 有符號整數
BIGINT 8 有符號整數
STRING 最大2GB 字串,類似SQL的VARCHAR型別
FLOAT 4 單精度浮點數
DOUBLE 8 雙精度浮點數
BOOLEAN TRUE/FALSE

hive複雜型別

基本型別 大小(位元組) 描述
Array 不限 陣列,順序儲存一列相同型別的資料
Struct 不限 結構體,儲存一列不同型別的資料
Map 不限 無序鍵值對,由一列的鍵值對組成

常用命令

# 查詢資料庫
show databases;

# 查詢表
show tables;

#使用資料庫
use database_name ;

# 查看錶結構
desc table_name;

建立表

建立表的格式

格式:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
  [(col_name data_type [COMMENT col_comment], ...
)] [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] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path] # 欄位解釋: [external] # 申明是否為外部表
[if not exists] # 如果表存在,則不建立了 [(col_name data_type [COMMENT col_comment], ...)] # 分別是 欄位名,欄位型別,欄位註釋 [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] # 在clustered by 裡的欄位上建立 num_buckets個桶,記錄是由 sorted by裡的欄位排序的。 [ROW FORMAT row_format] # 指定分隔符,可以是以下幾個: : DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [STORED AS file_format] # 指定load檔案的型別,分為: textfile 是 純文字檔案 sequence 是 壓縮檔案 [LOCATION hdfs_path] # 向表裡載入資料,hdfs_path是一個hdfs上的目錄,不能是檔案,hive會依據預設配置的hdfs路徑,自動將整個目錄下的檔案都載入到表中。

建立表的例項

建立一個簡單的內部表

create table if not exists T1(
    id int,
    name string,
    salary double comment 'comment是欄位註釋'
)comment 'comment是表註釋'
row format delimited
fields terminated by ','
stored as textfile;

建立外部表

create external table if not exists T1(
    id int,
    name string,
    salary double comment 'comment是欄位註釋'
)comment 'comment是表註釋'
row format 
delimited  fields terminated by ','
stored as textfile;

使用複雜型別建立表

create external table if not exists T2(
    id int,
    course array<string>,
    score  map<string,int>
)
row format
delimited fields terminated by ',' 
          collection items terminated by '|'
          map keys terminated by ':'
stored as textfile;
# 資料檔案內容
1001,語文|數學|英語,語文|56,語文:102|數學:2033|英語:30
1002,語文|數學|英語,語文|156,語文:120|數學:2033|英語:30
1003,語文|數學|英語,語文|1156,語文:210|數學:3320|英語:30
1004,語文|數學|英語,語文|1156,語文:2210|數學:203|英語:30
1005,語文|數學|英語,語文|5116,語文:22210|數學:230|英語:30
# 匯入資料檔案
load data local inpath '/home/datanode/hiveTest/test01' overwrite  into table t2;

建立一個帶分割槽的內部表

create table if not exists T3(
    id int,
    name string
)
partitioned by (classid int)
row format
delimited fields terminated by ','
stored as textfile;

建立一個帶桶的內部表

create table T4(
    id int ,
    name string,
    sex string,
    age int
)
partitioned by (city string)
clustered by(age) sorted by(name) into 5 buckets
row format 
delimited fields terminated by ','
stored as textfile;

載入資料

載入資料的格式

load 方式載入資料

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]  

#欄位解釋
[LOCAL] # 載入的是否是本地檔案

[OVERWRITE] # 是否覆蓋表裡原來的資料

[PARTITION (partcol1=val1, partcol2=val2 ...)]   # 如果表存在分割槽,指定載入到那個分割槽

insert 方式載入資料

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement  

#欄位解釋
[PARTITION (partcol1=val1, partcol2=val2 ...)] # 如果表存在分割槽,指定載入到那個分割槽

載入資料的例項

載入本地檔案

LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1  

載入hdfs上的檔案

LOAD DATA  INPATH '/user/admin/test/test.txt' OVERWRITE INTO TABLE test_1  

用insert載入資料

insert overwrite table t5 select * from t2;

insert into table t5 select * from t2;

查詢語句與常用命令

查詢格式

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[   CLUSTER BY col_list
  | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]

# 欄位解釋
[ALL | DISTINCT] # 查詢的欄位

[WHERE where_condition] # where子句
                     # 類似我們傳統SQLwhere 條件
                     # 目前支援 AND,OR ,0.9版本支援between
                     # IN, NOT IN
                     # 不支援EXIST ,NOT EXIST

[GROUP BY col_list [HAVING condition]] # 欄位分組和having子句

 [SORT BY| ORDER BY col_list]  # 排序
                        # ORDER BY與SORT BY的不同
                        # ORDER BY 全域性排序,只有一個Reduce任務
                        # SORT BY 只在本機做排序

[LIMIT number] # 限制查詢記錄數

查詢例項

# 查詢t2表的資料
select * from t2;

# 查詢10條t2表的資料
select * from t2 limit 10;

連線語句

hive 多表連線使用 join…on 語句
hive 只支援等值連線,即 on子句中只能使用等號連線
如果連線語句中有where子句,會先執行join子句,再執行where子句。

內連線

select * from t1 join t2 on t1.id = t2.id;

左外連線

select * from t1 left join t2 on t1.id=t2.id;

右外連線

select * from t1 right join t2 on t1.id=t2.id;

全外連線

select * from t1 outer join t2 on t1.id=t2.id;

左半連線

select * from t1 left semi join t2 on t1.id=t2.id;
# 等價於
selct * from t1 where t1.id in (select t2.id from t2);

in / not in / like / not like

hive 0.9.0版本開始支援 in , not in , like . not like
用法與SQL的 in , not in , like . not like的作用相同,就不在多說了。

修改表結構 : alter

# 修改表名
ALTER TABLE t1 RENAME TO 3koobecaf;

# 增加一個欄位
ALTER TABLE t1 ADD COLUMNS (new_col INT);

# 增加一個欄位,帶註釋
ALTER TABLE t1 ADD COLUMNS (new_col2 INT COMMENT 'a comment');

# 將表的欄位全部替換為新的欄位
ALTER TABLE t1 REPLACE COLUMNS (foo INT, bar STRING, baz INT);

函式

數字函式

函式 說明
round(double a, int d) 小數部分d位之後數字四捨五入,例如round(21.263,2),返回21.26
floor(double a) 對給定資料進行向下舍入最接近的整數。例如floor(21.2),返回21
ceil(double a) 將引數向上舍入為最接近的整數。例如ceil(21.2),返回23
rand() 返回大於或等於0且小於1的平均分佈隨機數
rand(int seed) 返回大於或等於0且小於seed的平均分佈隨機數
pow(double a, double p) power(double a, double p) 返回某數的乘冪
sqrt(double a) 返回數值的平方根
abs(double a) 取絕對值
pmod(int a, int b) pmod(double a, double b) 返回a除b的餘數的絕對值
positive(int a) positive(double a) 返回A的值,例如positive(2),返回2
negative(int a) negative(double a) 返回A的相反數,例如negative(2),返回-2

收集函式

函式 說明
size(Map) 返回的map型別的元素的數量
size(Array) 返回陣列型別的元素數量

日期函式

函式 說明
from_unixtime(bigint unixtime[, string format]) UNIX_TIMESTAMP引數表示返回一個值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,這取決於是否是在一個字串或數字語境中使用的功能。該值表示在當前的時區
unix_timestamp(string date) 指定日期引數呼叫UNIX_TIMESTAMP(),它返回引數值’1970- 01 – 0100:00:00′到指定日期的秒數。
to_date(string timestamp) 返回時間中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
to_dates(string date) 給定一個日期date,返回一個天數(0年以來的天數)
datediff(string enddate, string startdate) 兩個時間引數的日期之差
date_add(string startdate, int days) 給定時間,在此基礎上加上指定的時間段
date_sub(string startdate, int days) 給定時間,在此基礎上減去指定的時間段
year(string date) 返回指定時間的年份,範圍在1000到9999,或為”零”日期的0
month(string date) 返回指定時間的月份,範圍為1至12月,或0一個月的一部分,如’0000-00-00′或’2008-00-00′的日期
day(string date) 返回指定時間的日期
dayofmonth(date) 返回指定時間的日期
hour(string date) 返回指定時間的小時,範圍為0到23
minute(string date) 返回指定時間的分鐘,範圍為0到59
second(string date) 返回指定時間的秒,範圍為0到59
weekofyear(string date) 返回指定日期所在一年中的星期號,範圍為0到53

字串函式

函式 說明
length(string A) 返回字串的長度
reverse(string A) 返回倒序字串
concat(string A, string B…) 連線多個字串,合併為一個字串,可以接受任意數量的輸入字串
concat_ws(string SEP, string A, string B…) 連結多個字串,字串之間以指定的分隔符分開
substring(string A, int start, int len) 從文字字串中指定的位置指定長度的字元
upper(string A) ucase(string A) 將文字字串轉換成字母全部大寫形式
lower(string A) lcase(string A) 將文字字串轉換成字母全部小寫形式
trim(string A) 刪除字串兩端的空格,字元之間的空格保留
regexp_replace(string A, string B, string C) 字串A中的B字元被C字元替代
regexp_extract(string subject, string pattern, int index) 通過下標返回正則表示式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’
space(int n) 返回指定數量的空格
repeat(string str, int n) 重複N次字串
rpad(string str, int len, string pad) 返回指定長度的字串,給定字串長度小於指定長度時,由指定字元從右側填補。

聚合函式

函式 說明
count(*) 返回記錄條數
sum(*) 求和
avg(*) 求平均
min(*) 最小
max(*) 最大
ar_pop(col) 返回指定列的方差
var_samp(col) 返回指定列的樣本方差
stddev_pop(col) 返回指定列的偏差
stddev_samp(col) 返回指定列的樣本偏差
covar_pop(col1, col2) 兩列數值協方差
covar_samp(col1, col2) 兩列數值樣本協方差
corr(col1, col2) 返回兩列數值的相關係數

單次執行語句

# 不進入命令列,直接執行一次命令
hive -e 'select * from test05';

#將查詢到的內容放到a.txt中
hive -S -e 'select * from test05' >> a.txt

應用文章:

相關推薦

hive sql

hive資料型別 hive基本資料型別 基本型別 大小(位元組) 描述 TINYINT 1 有符號整數 SMALLINT 2 有符號整數 INT 4 有符號整數 BIGIN

九個最容易出錯的 Hive sql 及使用注意事項

**閱讀本文小建議:本文適合細嚼慢嚥,不要一目十行,不然會錯過很多有價值的細節。** 文章首發於公眾號:**五分鐘學大資料** #### 前言 在進行數倉搭建和資料分析時最常用的就是 sql,其語法簡潔明瞭,易於理解,目前大資料領域的幾大主流框架全部都支援sql語法,包括 hive,spark,flink

Oracle中動態SQL(EXECUTE IMMEDIATE)

Oracle中動態SQL詳解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠傾我心 閱讀數:744 標籤: oracle動態sqloracle 更多

hive 分割槽

hive中建立分割槽表沒有什麼複雜的分割槽型別(範圍分割槽、列表分割槽、hash分割槽、混合分割槽等)。分割槽列也不是表中的一個實際的欄位,而是一個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列的資訊與資料。 下面的語句建立了一個簡單的分割槽表: create table

Spark SQL

轉自:https://mp.weixin.qq.com/s/SGhYBxGd5qCVfeM70DRFTw 發家史 熟悉spark sql的都知道,spark sql是從shark發展而來。Shark為了實現Hive相容,在HQL方面重用了Hive中HQL的解析、邏輯執行計劃翻譯、執行計劃優化

Hive入門

簡介 Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供類SQL查詢功能 安裝Hive 將hive安裝到hadoop的同級目錄下 tar -zxvf apache-hive-2.3.3-bin.tar.gz -C

Hive原理

背景 引入原因: 1. – 對存在HDFS上的檔案或HBase中的表進行查詢時,是要手工寫一堆MapReduce程式碼 2. 對於統計任務,只能由動MapReduce的程式設計師才能搞定 3. 耗時耗力,更多精力沒有有效的釋放出來 Hive基於一個統一的查

Mybatis的動態SQL

使用動態SQL完成多條件查詢 動態SQL是MyBatis的一個強大的特性。動態SQL基於OGNL的表示式。實現動態SQL的元素如下。 if:利用if實現簡單的條件選擇 choose(when,otherwise):相當於Java中的switch語句,通常與when和otherwise搭配 where:簡化

Mybatis 動態SQL

id :在名稱空間中唯一的識別符號,可以用來引用這條語句parameterType:將會傳入這條SQL語句的引數類的完全限定名或別名parameterMap:這是引用外部parameterMap的已經廢棄的方法,使用內聯引數對映和ParameterType屬性。resultType:從這條語句返回的期望型別的

大資料(二十三)HiveHive三種啟動方式 、 HIVE Server2 、 jdbc連結HIVE

一:Hive的三種啟動方式 1, hive  命令列模式         進入hive安裝目錄,輸入bin/hive的執行程式,或者輸入 hive –service cli         用於linux平臺命令列查詢,查詢語句基本跟mysql查詢語句類似  2, hive

Mybatis---動態SQL(四)

(一)動態SQL簡介     使用JDBC對資料庫進行操作,通常需要根據需求手動的拼接SQL或重新編寫SQL語句,這是一項非常無聊和麻煩的操作,但是Mybatis提供了對SQL語句動態組裝的功能,恰好解決這一項麻煩的操作。 參考: Mybatis官方文件

使用java連線hive,並執行hive語句

安裝hadoop 和 hive我就不多說了,網上太多文章 自己看去 首先,在機器上開啟hiveservice hive --service hiveserver -p 50000 & 開啟50000埠,然後java就可以使用java連了,需要的jar包我發個圖片

超全MyBatis動態SQL

標簽 2.3 去除 mean not null 3.2 false foreach rtl MyBatis 令人喜歡的一大特性就是動態 SQL。在使用 JDBC 的過程中, 根據條件進行 SQL 的拼接是很麻煩且很容易出錯的。MyBatis 動態 SQL 的出現, 解決了這

008-Hadoop Hive sql語法3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

017-Hadoop Hive sql語法7-去重排序、數據傾斜

col 去重排序 sel cluster 可能 更多 分發 指定 clust 一、數據去重排序 1.1、去重   distinct與group by   盡量避免使用distinct進行排重,特別是大表操作,用group by代替   -- 不建議 selec

016-Hadoop Hive sql語法6-job輸入輸出優化、數據剪裁、減少job數、動態分區

分享 hive table 取數 nbsp put union 正在 style 一、job輸入輸出優化 善用muti-insert、union all,不同表的union all相當於multiple inputs,同一個表的union all,相當map一次輸出多條

Hadoop Hive sql語法

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL

Hive sql語法

1.  DDL 操作 DDL •建表 •刪除表 •修改表結構 •建立/刪除檢視 •建立資料庫 •顯示命令 建表: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type [COMMENT

Hadoop Hive sql語法5--HiveQL與SQL區別

1.hive內聯支援什麼格式?2.分號字元注意什麼問題?3.hive中empty是否為null? 4.hive是否支援插入現有表或則分割槽中? 5.hive是否支援INSERT INTO 表 values()? 1、Hive不支援等值連線 •SQL中對兩表內聯可以寫成:•s

Hadoop Hive sql語法3--DML 操作:元資料儲存

轉載自:http://www.aboutyun.com/thread-7326-1-1.html 1 基本的Select 操作 SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_referenc