HIve常用函式

2022-08-23 05:57:10 字數 3447 閱讀 6180

最近使用了hive一些高階函式,在此記錄一下

hive是面向大資料的資料倉儲,是一種將sql轉換為mapreduce的工具。

內錶、外表、分割槽、桶表、location、壓縮這些都是表的屬性,每個之間沒有什麼關係(內錶外表不可以同時存在)。也就是說乙個表既可以是內錶,也可是分割槽表桶表,也可以規定存放路徑還可壓縮

內錶其實就是將拷貝到hive的目錄下,表和資料關聯,表刪除資料刪除。

create table if not exists table_test

(aa string

)row format delimited fields terminated by '\001'

location '/hive/table/table_test';

以上的語句就是建乙個內錶,一行是一條記錄,字段之間按照\001分割,資料最終存放的位置是/hive/table/table_test。

裝載資料:

insert into table_test

select aa from table_aa;

或load data inpath '/hive/date/table_test' overwrite into table table_test;(overwrite是覆蓋資料,可去掉)

內錶相對來說是不安全的:因為表刪除後資料就丟了。所以還有外表,將資料和表分開(外表drop後重新,什麼都沒有變會將資料load兩份)。

create external table if not exists table_test

(aa string

) row format delimited fields terminated by '\001'

location '/hive/table/table_test';

以上的語句就是建乙個外表,一行是一條記錄,字段之間按照\001分割,資料最終存放的位置是/hive/table/table_test。

裝載資料:

load data inpath '/hive/date/table_test' overwrite into table table_test;(overwrite是覆蓋資料,可去掉)

分割槽表其實就是將資料按照乙個字段放進去不同的資料夾,減少資料掃瞄。(分割槽表是資料夾名字就是欄位名字,分資料夾)

create table if not exists table_test

(aa string

) partitioned by (date string,hour string)

row format delimited fields terminated by '\001'

location '/hive/table/table_test';

以上的語句就是建乙個內錶同時又是分割槽表,一行是一條記錄,字段之間按照\001分割,資料最終存放的位置是/hive/table/table_test。

裝載資料:

insert into table_test partition (date=20190908,hour)

select aa,hour from table_aa;

或load data inpath '/hive/date/table_test' overwrite into table table_test partition (date=20190908,hour=12)

;(overwrite是覆蓋資料,可去掉)

桶表其實就是將資料按照乙個字段放進去不同檔案,減少資料掃瞄。(將date取hash,對結果對4取餘確定檔案,個人理解哈哈)

create table if not exists table_test

(aa string

) clustered by(date) into 4 buckets

row format delimited fields terminated by '\001'

location '/hive/table/table_test';

以上的語句就是建乙個內錶同時又是桶表,一行是一條記錄,字段之間按照\001分割,資料最終存放的位置是/hive/table/table_test。

裝載資料:

insert into table_test

select aa,date from table_aa;

或load data inpath '/hive/date/table_test' overwrite into table table_test;(該操作是不會將結果分檔案的,其實沒有起到桶表的作用)

表壓縮的好處不言而喻,節約空間減少傳輸,以下是最優的選擇。

//stored as後可跟檔案儲存格式(textfile、sequencefile、rcfile、parquet)  

裝載資料:

insert into table_test

select aa,date from table_aa;

或load data inpath '/hive/date/table_test' overwrite into table table_test;(該操作是不會將結果分檔案的,其實沒有起到桶表的作用)

例子:select aa from table lateral view json_tuple(jsonstr,'aa','bb','cc') tmp1 as aa,bb,cc;

原值:jsonstr

結果值:

aa            bb            cc  

1               2             3

將表中jsonstr按照json型別解析,將其中aa,bb,cc的值提取出來,生成的列叫做aa,bb,cc。沒有值的資料會預設填空。非常適合處理髒json資料。

例子:select explode(split(regexp_replace(regexp_replace(jsonstr,'\\[\\]',''),'},\\,,]

結果值:

jsonstr

aa:1,bb:2,cc:3

aa:4,bb:5,cc:6

aa:7,bb:8,cc:9

將表中jsonstr替換掉按照},{將資料分為陣列,然後展開

alter table table rename to aa;    將表的名稱改變

alter table table add columns (bb string comment);  //增加列

修改速度很快(原因是修改了元資料)

以後插入資料的時候會多需要一列的資料。

查詢歷史資料的bb列為null值。

真正看歷史檔案是沒有bb列的。

alter table table replace columns (bb string comment);  //刪除列,基本理論和增加一致

alter table table drop partition (stat_year_month='20190908');刪除分割槽

truncate table table;清空表

Hive常用函式

if判斷 select if 1 1,yes no 返回yes 語法 case expression when condition1 then result1 when condition2 then result2 else result end 例子 case a when 1 then one...

hive常用函式

hive常用函式 1 檢視函式用法 desc function 函式名 desc function extended 函式名 2 獲取array陣列長度 size函式 select size collect list field from table select size split hello ...

Hive常用函式

常用日期函式 unix timestamp 返回當前或指定時間的時間戳 from unixtime 將時間戳轉為日期格式 current date 當前日期 current timestamp 當前的日期加時間 to date 抽取日期部分 year 獲取年 month 獲取月 day 獲取日 ho...