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子句
# 類似我們傳統SQL的where 條件
# 目前支援 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:從這條語句返回的期望型別的
大資料(二十三)Hive【Hive三種啟動方式 、 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