日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

HIVE开发总结

發(fā)布時(shí)間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HIVE开发总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

基本數(shù)據(jù)類型... 3

查看所有函數(shù)... 3

搜索函數(shù)... 3

搜索表... 4

查看函數(shù)使用方法... 4

關(guān)鍵字補(bǔ)全... 4

顯示表頭... 4

SET環(huán)境變量... 5

查看建表語(yǔ)句、數(shù)據(jù)文件置... 5

執(zhí)行外部命令... 6

NVL. 6

CONCAT. 7

IF. 7

CASE. 8

TRIM.. 9

SUBSTRING.. 10

LENGTH.. 11

UPPER. 11

非空判斷... 11

LPAD.. 12

日期函數(shù)... 12

is null = = null】?、【is not null = <> null】?... 13

[NOT] IN[NOT] EXISTSLEFT SEMI JOIN.. 14

ORDER BYSORT BY. 15

ROW_NUMBER. 18

ON > WHERE > HAVING.. 21

ON非連接字段條件問(wèn)題... 21

NULL值條件問(wèn)題... 23

正則表達(dá)式... 24

小數(shù)精度問(wèn)題... 24

增量更新表... 26

其他... 27

?

基本數(shù)據(jù)類型

(常用的兩種建表例子)

查看所有函數(shù)

SHOW FUNCTIONS;

搜索函數(shù)

[erp@master2-dev ~]$ hive -S -e "SHOW FUNCTIONS" | grep time

from_unixtime

from_utc_timestamp

to_unix_timestamp

to_utc_timestamp

unix_timestamp

?

[erp@master2-dev ~]$ hive -S -e "SHOW FUNCTIONS" | grep date

date_add

date_sub

datediff

finance.getdate

to_date

搜索表

SHOW TABLES;

SHOW TABLES '*534';

查看函數(shù)使用方法

DESCRIBE FUNCTION EXTENDED concat;

關(guān)鍵字補(bǔ)全

命令行中的Tab:列出所有關(guān)鍵字及補(bǔ)全。所以如果腳本需要在HIVE命令行里直接調(diào)試時(shí),腳本不要使用Tab來(lái)縮進(jìn),使用空格

顯示表頭

set hive.cli.print.header=true;

SET環(huán)境變量

在命令行中,可以使用 SET 命令顯示或者修改變量的值

如果直接輸入 SET? 命令,即會(huì)顯示所有環(huán)境變量

hivevar hiveconf 變量不同的是,system: env: 前綴是不能省略的

使用變量:${變量}

set hivevar:dd=aa;??

select '${hivevar:dd}';//注:使用時(shí)加上命名空間

注:定義與使用時(shí)還是最好加上hivevar名稱空間,否則可能找不到

set hiveconf:hive.exec.dynamic.partition.mode=nonstrict;

查看建表語(yǔ)句、數(shù)據(jù)文件置

show create table sap_r3_zfit534;

DESCRIBE formatted ?sap_r3_zfit534;

執(zhí)行外部命令

hive命令提示符下執(zhí)行Hadoopdfs命令:

只需要將hadoop命令中的關(guān)鍵字hadoop去掉,并以分號(hào)結(jié)尾即可:

dfs -ls hdfs://SuningHadoop2/user/erp/hive/warehouse/erp.db/ztst_6;

?

用戶在不用退出hive命令符就可以執(zhí)行簡(jiǎn)單的 bash shell 命令:以 ! 開(kāi)頭,以 ; 結(jié)尾

hive> ! echo 'Hello';

NVL

NVL( string1, replace_with)??

string1 NULLNVL函數(shù)返replace_with值,否則返string1

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,1 as f3;

select *,nvl(f2,'值為NULL') from test;

CONCAT

concat(str1, str2, ... strN):如果其中任何一個(gè)為NULL,則結(jié)果為NULL,所以最好結(jié)合NVL使用:

concat(NVL(a.office,''),'00',NVL(b.posOrderId,'')))

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,1 as f3;

select *,concat(f1,f2,f3) from test;?????????

select *,concat(f1,nvl(f2,'NULL'),f3) from test;

IF

if(條件,1,2)

當(dāng)條件為真時(shí),取值1,否則取值2。值1或值2還可以是其他可返回值的函數(shù)表達(dá)式,如IFCASE,即可以嵌套IF

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,1 as f3;

select *,if(f2 isnull,'NULL','NOT NULL') from test;

CASE

情況很多時(shí),可以使用CASE來(lái)代替嵌套的IF

case

??? when b.kunnr is not null and b.kunnr <> '' then b.kunnr

??? when b.lifnr is not null and b.lifnr <> '' then b.lifnr

??? else b.hkont

end

?

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,2 as f3

unionall

SELECT'c' f1,'d'as f2,3 as f3;

select *,case f3 when 1 then'' when 2 then'' when 3 then''endfrom test;

TRIM

去除前后空格

selecttrim('?? facebook? '),length(trim('?? facebook? '));

如果為NULL,則trim結(jié)果還是NULL

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3

unionall

SELECT'b' f1,'c'as f2,2 as f3;

select *,trim(f2) from test;

注:Trim不能直接對(duì)NULL進(jìn)行操作:

hive> selecttrim(null);?

FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments 'TOK_NULL': trim takes only STRING/CHAR/VARCHAR types. Found VOID

但通過(guò)其他函數(shù)返回的NULL值是可以的(因?yàn)檫@些函數(shù)返回的類型為字符類型而非VOID類型):

selecttrim(if(1<>1,'1',null));

SUBSTRING

substr(str, pos[, len]) :位置是從1開(kāi)始數(shù),不是0。如果是負(fù),則從后往前數(shù),然后再截后面

SELECTsubstr('Facebook', 5) ;

'book'

SELECTsubstr('Facebook', -5) ;

'ebook'

SELECTsubstr('Facebook', 5, 1);;

'b'

substring(a.XBLNR,1,4)--XBLNR前四位

如果為NULL,則返回NULL

LENGTH

字符串長(zhǎng)度

如果為NULL,則返回NULL

注:NULL <> 0

UPPER

轉(zhuǎn)大寫(xiě):

upper(trim(nvl(c.USNAM,''))) <> 'RETAIL'

如果為NULL,則返回NULL

非空判斷

如果有將NULL與空字符串都看做空的話,可以這樣:

trim(nvl(b.KUNNR,'')) <> ''

LPAD

左填充:lpad(str, len, pad)

如果str長(zhǎng)度小于len,則使用pad填充左側(cè)直到len長(zhǎng)度:

SELECTlpad('hi', 5, '??') ;

如果str長(zhǎng)度大于len,則會(huì)截?cái)嘀?/span>len長(zhǎng)度:

SELECTlpad('hi', 1, '??') ;

rpad(str, len, pad)

日期函數(shù)

select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss'); --當(dāng)前時(shí)間

select from_unixtime(unix_timestamp('20150101','yyyyMMdd'),'yyy-MM-dd'); --格式化

select from_unixtime(unix_timestamp('2015/01-01','yyyy/MM-dd'),'yyyMMdd');--去掉日期格式

unix_timestamp('20150101','yyyyMMdd') to_unix_timestamp('20150101','yyyyMMdd')相同

unix_timestamp 可以返回當(dāng)前時(shí)間to_unix_timestamp不可以

is null = = null】?、【is not null = <> null】?

hive 里(包括IF函數(shù)與Where條件里)判斷是否為NULL要用 is null is not null ,不能使用 <> null = null(雖然不報(bào)錯(cuò))

測(cè)試如下:

droptable test;

CREATETABLE test AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,1 as f3;

select * from test where f2 = null;

select * from test where f2 isnull;

select *,if(f2=null,'null','not null') from test;

select *,if(f2 isnull,'null','not null') from test;

?[NOT] IN[NOT] EXISTSLEFT SEMI JOIN

droptable test1;

CREATETABLE test1 AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,2 as f3;

?

droptable test2;

CREATETABLE test2 AS

SELECT'a' f1,nullas f2,3 as f3?

unionall

SELECT'd' f1,'d'as f2,4 as f3;

select * from test1 a whereEXISTS(select f1 from test2 b where a.f1 = b.f1); --注:HIVE與標(biāo)準(zhǔn)SQL不同的是:[NOT] EXISTS后面跟的子查詢一定要是相關(guān)子查詢,否則運(yùn)行出錯(cuò)(相關(guān)子查詢對(duì)外層查詢結(jié)果集中的每條記錄都會(huì)執(zhí)行一次,所以盡量少用相關(guān)子查詢——標(biāo)準(zhǔn)SQL好似這樣,HIVE不一定)

select * from test1 a where a.f1 IN(select f1 from test2 b);

select * from test1 a? LEFT SEMI JOIN test2 b on a.f1 = b.f1;

SEMI-JOIN比通常的inner JION效率要高:對(duì)于左表中的一條記錄,在右邊表中一旦找到匹配的記錄,Hive就會(huì)立即停止掃描

LEFT SEMI JOIN 的限制是:右表中的字段只能在ON 子句中設(shè)置過(guò)濾條件,在 WHERE 子句、SELECT 子句或其他地方過(guò)濾都不行,所以這也就是為什么LEFT SEMI JOIN 只能當(dāng)作 IN/EXISTS 來(lái)使用的原因

早期版本可能還不支持[NOT] IN[NOT] EXISTS,所以最好使用LEFT SEMI JOIN

ORDER BYSORT BY

ORDER BY為全局排序,會(huì)將所有數(shù)據(jù)送到同一個(gè)Reducer中后再對(duì)所有數(shù)據(jù)進(jìn)行排序,對(duì)于大數(shù)據(jù)會(huì)很慢,謹(jǐn)慎使用

SORT BY為局部排序,只會(huì)在每一個(gè)Reducer中對(duì)數(shù)據(jù)進(jìn)行排序,在每個(gè)Reducer輸出是有序的,但并非全局排序(每個(gè)reducer出來(lái)的數(shù)據(jù)是有序的,但是不能保證所有的數(shù)據(jù)是有序的——即文件(分區(qū))之間無(wú)序,除非只有一個(gè)reducer

DISTRIBUTE BY 是控制map的輸出被送到哪個(gè)reducer端進(jìn)行匯總計(jì)算。注:HIVE reducer分區(qū)個(gè)數(shù)由mapreduce.job.reduces來(lái)決定,該選項(xiàng)只決定使用哪些字段做為分區(qū)依據(jù),如果沒(méi)通過(guò)DISTRIBUTE BY指定分區(qū)字段,則默認(rèn)將整個(gè)文本行做為分區(qū)依據(jù)。分區(qū)算法默認(rèn)是HASH,也可以自己實(shí)現(xiàn)。

:這里DISTRIBUTE BY講的分區(qū)概念是指Hadoop里的,而非我們HIVE數(shù)據(jù)文本存儲(chǔ)分區(qū)。Hadoop里的Partition主要作用就是將map的結(jié)果發(fā)送到相應(yīng)的reduce,默認(rèn)使用HASH算法,不過(guò)可以重寫(xiě)

droptable test1;

createtable test1 as

select'typea' f1,6 f2

unionall

select'typea' f1,2 f2

unionall

select'typeb' f1,7 f2

unionall

select'typec' f1,8 f2

unionall

select'typeb' f1,5 f2

unionall

select'typea' f1,1 f2

unionall

select'typeb' f1,3 f2

unionall

select'typec' f1,4 f2;

select * from test1 orderby f2 asc;--全局有序

set mapreduce.job.reduces=10;

select * from test1 sort by f2;--雖然SORT BY是區(qū)內(nèi)有序,但由于未通過(guò)DISTRIBUTE指定分區(qū)字段,而最大分區(qū)又設(shè)置為了10,所以每條記錄所分配到的reducer可能不盡相同(有可能某兩條會(huì)放在同一分區(qū)中,這取決于HASH算法),所以此時(shí)看不出什么區(qū)內(nèi)有序

set mapreduce.job.reduces=1;

select * from test1 sort by f2;--將最大分區(qū)設(shè)置為一個(gè)分區(qū),所以具有order by一樣具有全局排序效果

set mapreduce.job.reduces=10;

select * from test1 DISTRIBUTE BY f1 sort by f2;--將最大分區(qū)設(shè)為10,再通過(guò)DISTRIBUTE指定分區(qū)字段,而不使用默認(rèn)整行文本來(lái)分區(qū)

set mapreduce.job.reduces=2;

select * from test1 DISTRIBUTE BY f1 sort by f2;--由于分區(qū)最大設(shè)置為2f1分區(qū)字段值有3種,這會(huì)根據(jù)HASH分區(qū)算法,會(huì)將其中某兩種放在同一分區(qū),而另外一種放在另外的分區(qū),最終看到兩個(gè)分區(qū)內(nèi)部也是有序的

ROW_NUMBER

類似Oracle中的ROWNUM,給查詢出的記錄編號(hào),HIVE中一般與DISTRIBUTE BY一起使用。其作用按指定的列進(jìn)行分組生成行序列,在ROW_NUMBER() 時(shí),會(huì)根據(jù) DISTRIBUTE BY (a,b...)中指定的列來(lái)判斷,若兩條記錄的ab列相同,則行序列+1,否則重新計(jì)數(shù)。因?yàn)?/span>HIVE是基于MAPREADUCE的,必須保證列值相同的記錄要在同一個(gè)reduce,所以需要與DISTRIBUTE BY結(jié)合使用,否則ROW_NUMBER無(wú)意義。

假設(shè)一個(gè)場(chǎng)景:存在表test1,該表的數(shù)據(jù)如下

id??? rate????? score

1???? '0-4'????? 10

2???? '0-4'????? 40

3???? '0-4'????? 30

4???? '0-4'????? 20

5???? '5-10'?? 10

6???? '5-10'?? 40

7???? '5-10'?? 30

8???? '5-10'?? 20

9???? '11-20' 10

10? '11-20' 40

11? '11-20' 30

12? '11-20' 20

現(xiàn)在要求用一條查詢語(yǔ)句取出每種ratescore最大的兩條記錄,也就算取出id為:23671011的記錄

droptable test1;

createtable test1 as

select 1 id,'0-4' rate,10 score

unionall

select 2 id,'0-4' rate,40 score

unionall

select 3 id,'0-4' rate,30 score

unionall

select 4 id,'0-4' rate,20 score

unionall

select 5 id,'5-10' rate,10 score

unionall

select 6 id,'5-10' rate,40 score

unionall

select 7 id,'5-10' rate,30 score

unionall

select 8 id,'5-10' rate,20 score

unionall

select 9 id,'11-20' rate,10 score

unionall

select 10 id,'11-20' rate,40 score

unionall

select 11 id,'11-20' rate,30 score

unionall

select 12 id,'11-20' rate,20 score;

?

SELECT a.*? FROM(SELECT *,row_number() over (distribute by rate SORTBY rate ASC, score DESC) rownum FROM test1 )? a WHERE rownum? <= 2 ;--結(jié)果正確,只啟動(dòng)一個(gè)JOB

注:可以去掉SORT BY后面分區(qū)字段,而不影響結(jié)果,應(yīng)該是在排序時(shí)默認(rèn)就已加上了分區(qū)字段,但以防出錯(cuò),不要省略

注:ROW_NUMBER+DISTRIBUTE BY結(jié)果與分區(qū)個(gè)數(shù)無(wú)關(guān),所以通過(guò)set mapreduce.job.reduces不會(huì)影響正確結(jié)果:

hive> set mapreduce.job.reduces=1;

hive> SELECT a.*? FROM(SELECT *,row_number() over (distribute by rate SORT BY score DESC) rownum FROM test1 )? a WHERE rownum? <= 20;

?

SELECT a.*? FROM(SELECT *,row_number() over (partition? by rate ) rownum? FROM test1 SORT BY rate ASC, score DESC)? a WHERE rownum? <= 2 ;--看見(jiàn)有人這么用過(guò),但結(jié)果不正確partition到底有啥用?會(huì)啟動(dòng)兩個(gè)JOB,相對(duì)于distribute感覺(jué)慢,所以還是使用distribute

row_number()另一作用可以用來(lái)去除重復(fù):先按分組字段分區(qū),再通過(guò) rownum = 1過(guò)濾即可。另外,去重還可以借助于group by

select actual_pymnt_dt from sap_r3_ZFIT684_tmp groupby actual_pymnt_dt

ON > WHERE > HAVING

為了提交性能,INNER JOIN時(shí),非連接條件放置的位置應(yīng)該按照 ON > WHERE > HAVING的順序優(yōu)先放置,因?yàn)?/span>SQL條件的的執(zhí)行一般是按這個(gè)順序來(lái)執(zhí)行的,將條件放在最開(kāi)始執(zhí)行,則可過(guò)濾掉大部數(shù)據(jù);

如果是LEFT JOIN,非連接條件放在WHERE還是ON中是有所不同的,請(qǐng)參考后面

ON非連接字段條件問(wèn)題

1、????????? ON條件中不支持OR連接,只能使用AND

2、????????? 在外連接中,不要輕易的將Where中的條件移到ON連接語(yǔ)句中(雖然不報(bào)錯(cuò)),因?yàn)樵?/span>HIVE的外連接ON語(yǔ)句中,會(huì)忽略(嚴(yán)格來(lái)講不是忽略,而是只拿滿足條件的記錄去與另一表進(jìn)行關(guān)聯(lián),左表沒(méi)關(guān)聯(lián)上的還是會(huì)顯示出來(lái),請(qǐng)看后面實(shí)驗(yàn))掉所有除連接字段條件所有條件

droptable test1;

CREATETABLE test1 AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,2 as f3;

?

droptable test2;

CREATETABLE test2 AS

SELECT'a' f1,nullas f2,3 as f3?

unionall

SELECT'd' f1,'d'as f2,4 as f3;

select * from test1 a leftjoin test2 b on a.f1=b.f1;

select * from test1 a leftjoin test2 b on a.f1=b.f1 and a.f1='a';

select * from test1 a leftjoin test2 b on a.f1=b.f1 where a.f1='a';

嚴(yán)格為講,ON中的非連接條件還是起一定作用的:如下面的a記錄所對(duì)應(yīng)的右表記錄為NULL,因?yàn)闂l件a.f1='b'只會(huì)拿滿足條件的左表記錄b去與右表去關(guān)聯(lián),但未關(guān)聯(lián)上,所以對(duì)應(yīng)的右表顯示為NULL;不滿足條件的左表記錄a不會(huì)去做關(guān)聯(lián)(雖然在右表中存在),但還是會(huì)顯示出來(lái),只是所以對(duì)應(yīng)的右表也顯示為NULL

select * from test1 a leftjoin test2 b on a.f1 = b.f1 and a.f1 = 'b';

思考下面的結(jié)果?

select * from test1 a leftjoin test2 b on a.f1=b.f1 and b.f1='d';

?

對(duì)于INNER JOINON語(yǔ)中中的非連接條件是起做用的:

select * from test1 a innerjoin test2 b on a.f1=b.f1 and a.f1='a';

總結(jié)

1、????????? 如果是INNER JOIN,為了提高性能,非連接字段條件最好放置在ON從句中

2、??? 如果是LEFT JOIN,非連接字段條件最好放在Where從句中,但若想放在ON從句中,可以使用嵌套子查詢來(lái)解決不必要的麻煩:

在外聯(lián)連中,如果要想Where語(yǔ)句中的條件移到ON語(yǔ)句中,可以使用如下的嵌套語(yǔ)句來(lái)實(shí)現(xiàn),這樣即在聯(lián)接前過(guò)濾了不必要的數(shù)據(jù),提高效率的同時(shí)又沒(méi)有丟掉數(shù)據(jù):

select * from (select * from test1 where f1='a') a leftjoin test2 b on a.f1=b.f1;

NULL值條件問(wèn)題

如果某字段存為NULL的值,則用該字段進(jìn)行過(guò)濾時(shí),NULL需要單獨(dú)處理:

droptable test1;

CREATETABLE test1 AS

SELECT'a' f1,nullas f2,1 as f3?

unionall

SELECT'b' f1,'c'as f2,2 as f3

unionall

SELECT'd' f1,'d'as f2,3 as f3;

select * from test1 where f2 <> 'c';--NULL值的沒(méi)有查出來(lái)(標(biāo)準(zhǔn)SQL也是這樣的)

select * from test1 where f2 <> 'c' or f2 is null; --如果需要取出NULL,需要單獨(dú)加上

正則表達(dá)式

regexp_extract(str, regexp[, idx]) - extracts a group that matches regexp抽取匹配到的指定組

SELECT regexp_extract('100\\200', '^(\\d+).(\\d+)$', 0);

100\200

?

SELECT regexp_extract('100-200', '^([0-9]+)-([0-9]+)$', 1);

100

?

SELECT regexp_extract('100-200', '^([0-9]+)-(\\d+)$', 2);

200

注:\需要使用轉(zhuǎn)義一下

小數(shù)精度問(wèn)題

不要使用Float類型

在建表時(shí),如果要將金額字段定義成數(shù)據(jù)類型,請(qǐng)將定義成Double類型,或?qū)?shù)字類型比較時(shí),請(qǐng)先轉(zhuǎn)換成Double再進(jìn)行比較,否則不準(zhǔn)確(早其版本會(huì)有精度丟失問(wèn)題):

cast(a.payAmount as double) = cast(b.payAmount as double)

或者直接通過(guò)字符串比較的方式來(lái)比較數(shù)字,但比較前需要前后對(duì)齊(如不補(bǔ)齊會(huì)導(dǎo)致9.8 > 10.8),請(qǐng)看下面:

select a as a000000000,

regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',0) c0,--整個(gè)匹配

regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',1) c1,--正負(fù)號(hào)

regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',2) c2,--整數(shù)部分

regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',3) c3,--小數(shù)點(diǎn)

regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',4) c4,--小數(shù)部分

case concat(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',1),'')

when '-'then

concat('-',lpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',2),16,'0'),'.',

rpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',4),4,'0'))

else

concat('0',lpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',2),16,'0'),'.',

rpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',4),4,'0'))

end c500000000000000000000,--整數(shù)、小數(shù)部分對(duì)齊

case concat(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',1),'')

when '-'then

cast(concat('-',lpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',2),16,'0'),'.',

rpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',4),4,'0')) asdouble)

else

cast(concat('0',lpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',2),16,'0'),'.',

rpad(regexp_extract(trim(a),'^([-+]?)([0-9]*)(\.?)([0-9]*)$',4),4,'0')) asdouble)

end c6--轉(zhuǎn)換成真正的小數(shù)

from test0002;

增量更新表

insert overwrite table erp.tsor_BKPF --要更新此表

SELECT td.* FROM (

????????????? select? ta.*

????????????? from erp.tsor_BKPF ta? --先要把原來(lái)中未更新的數(shù)據(jù)撈出來(lái)

????????????? leftjoin (select tc.MANDT,tc.BUKRS,tc.BELNR,tc.GJAHR from BI_SOR.TSOR_FN_R3_BKPF_D tc --此表為增量表

????????????? where tc.STATIS_DATE='${hivevar:statis_date}' )tb on

???????????????????? ??? ta.MANDT=tb.MANDT

????????????? ?????? and ta.BUKRS=tb.BUKRS

???????????????????? ?? and ta.BELNR=tb.BELNR

????????????? ?????? and ta.GJAHR=tb.GJAHR

????????????? where concat(tb.MANDT,tb.BUKRS,tb.BELNR,tb.GJAHR) isnull

?

union all

?

????????????? select? ta.*????? --再與發(fā)生更新的數(shù)據(jù)Union

????????????? from BI_SOR.TSOR_FN_R3_BKPF_D ta

????????????? where ta.STATIS_DATE='${hivevar:statis_date}'

)td;

?

分區(qū)表更新:

insert overwrite table erp.sap_r3_ZFIT684 PARTITION (actual_pymnt_dt)

select e.* from

(

?????? --未更新的數(shù)據(jù)

?????? select a.* from (

?????? select * from erp.sap_r3_ZFIT684 d? --目標(biāo)表

?????? --CBT平臺(tái)拋數(shù)據(jù)任務(wù)里不支持 HIVE變量,所以如果要使用 ${hivevar:statis_date}變量的話,需要將后置SQL做成HIVE任務(wù)

?????? --where actual_pymnt_dt = '${hivevar:statis_date}'

?????? LEFT SEMI JOIN (select actual_pymnt_dt from sap_r3_ZFIT684_tmp groupby actual_pymnt_dt) dd

?????? ond.actual_pymnt_dt = dd.actual_pymnt_dt--從目標(biāo)表中只撈出需要處理的分區(qū)數(shù)據(jù)

?????? ) a

?????? leftjoin (select

?????? mandt,serial_no,shkzg,xblnr,payee_co_code,biz_categ,biz_sub_categ,zuonr,money,pymnt_amt,

?????? supplier_name,waers,twaers,sgtxt,bukrs3,belnr3,gjahr3,flag3,meg3,belnr2,gjahr2,flag2,meg2,

belnr1,gjahr1,budat1,flag1,meg1,msg,clear,refund_no,file_name,RECIVE_DT,RECIVE_TM,actual_pymnt_dt

?????? from? erp.sap_r3_ZFIT684_tmp) b? --增量表

?????? on a.MANDT=b.MANDT and a.SERIAL_NO=b.SERIAL_NO and a.SHKZG=b.SHKZG --通過(guò)主鍵進(jìn)行關(guān)聯(lián)

?????? where b.MANDT isnulland b.SERIAL_NO isnulland b.SHKZG isnull

?

union all

?

?????? --已更新的數(shù)據(jù)(包括新增、修改的數(shù)據(jù),刪除需要在上面取未更新的數(shù)據(jù)時(shí)過(guò)濾掉即可 )

?????? select

?????? mandt,serial_no,shkzg,xblnr,payee_co_code,biz_categ,biz_sub_categ,zuonr,money,pymnt_amt,

?????? supplier_name,waers,twaers,sgtxt,bukrs3,belnr3,gjahr3,flag3,meg3,belnr2,gjahr2,flag2,meg2,

belnr1,gjahr1,budat1,flag1,meg1,msg,clear,refund_no,file_name,RECIVE_DT,RECIVE_TM,actual_pymnt_dt

?????? from erp.sap_r3_ZFIT684_tmp c

) e;

其他

1、????????????? JOIN查詢時(shí),盡量將小表放在前面

2、????????????? 兩個(gè)表join的時(shí)候,不支持兩個(gè)表的字段非等值操作,可以將非相等條件提取到where

附件列表

?

總結(jié)

以上是生活随笔為你收集整理的HIVE开发总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。