SQL學習筆記(十一)Hive SQL和Presto SQL對比


時間轉換

注意此處的"timestamp"指'2020-07-20 10:58:59'這種格式,timestamp才是指'1595932031'這種格式,日期格式指2021-08-28

獲取當前時間

Hive Presto
sysdate() localtimestamp

"timestamp"轉日期

Hive Presto
to_date('2021-08-28 14:00:00')/get_date('2021-08-28 14:00:00') format_datetime(cast('2015-11-11 10:00:00' as timestamp), 'yyyy-MM-dd')
  • unix_timestamp('2021-08-28 10:00:00')的結果是1630116000;
  • cast('2021-08-28 10:00:00' as timestamp)的結果是2021-08-28 10:00:00.0;大家timestamp的格式不一樣

以上轉換后的結果為:'2021-08-28'

timestamp轉"timestamp"

Hive Presto
from_unixtime(1630130400,'yyyy-MM-dd HH:mm:ss') from_unixtime(1630130400)
  • Hive的from_unixtime()如果不加'yyyy-MM-dd HH:mm:ss'同樣可以返回到秒的結果;如果只需要格式化到小時、分鍾等的話只給出到對應位置的格式化參數即可
  • Presto的from_unixtime()不需要使用格式化參數來指定格式化的位數而且其中的類型必須是數值型,如果不是需要先使用cast轉為數值型才可,或者會報錯,默認返回到毫秒經度。如果需要指定返回的精度配合format_datetime使用即可。也就是Presto必須依靠format_datetime來返回指定精度,這一點Hive不需要
select format_datetime(from_unixtime(1630130400),'yyyy-MM-dd HH:mm:ss')

以上轉換后的結果為:'2021-08-28 14:00:00.000'

"timestamp"轉timestamp

Hive Presto
unix_timestamp('2021-08-28 14:00:00') cast(to_unixtime( cast ( '2021-08-28 14:00:00' as timestamp)) as bigint)
  • presto這里的轉換使用起來比較麻煩,需要to_unixtime和timestamp結合起來使用才行
to_unixtime( cast ( '2021-08-28 14:00:00' as timestamp))
--輸出結果為1.63008E9,因此要用cast再次轉換

以上轉換后的結果為:'1630130400'

計算兩個時間相差的天數

Hive Presto
datediff('2021-08-28','2021-08-27 15:25') date_diff('day',cast('2021-08-27' as date),cast('2021-08-28' as date))
  • Hive:計算兩個日期之間的天數差值,是拿'2021-08-28'減去'2021-08-27',即使date1和date2精確到的粒度不一致,如date1到天,date2到分鍾結果仍然只是天粒度的差值。
  • Presto:這里需要三個參數,第一個參數指定計算的是“天”差值、“小時”差值等,另外需要把date1和date2轉為date類型,否則SQL會報錯,並且Presto是后面的日期減去前面的日期

以上轉換后的結果為:1

計算某個日期的前N天或者后N天

Hive Presto
date_add('2021-08-28',1)/date_sub('2021-08-28',1)/get_date('2021-08-28',1)/get_date('2021-08-28',-1) date_add('day', 1, cast('2021-08-28' as date) )
  • Hive:date_add和date_sub分別是向后推N天和向前推N天,另外這里增加或減少后日期只精確到天,即使date1是精確到秒粒度的計算結果最終仍然是到天粒度。
  • Presto:這里同樣需要三個參數后推日期的粒度,后推多少天,基准日期。另外需要注意preto這里沒有date_sub函數,需要使用的話可以把第二個參數改為負值即可。
Hive:select date_add('20210828',1)
--會反映NULL
Hive:select get_date('20210828',1)
--同樣可以轉換為2021-08-29

以上轉換后的結果為:'2021-08-28','2021-08-27'

帶杠日期轉不帶杠

Hive Presto
get_dt_date('2021-08-28') format_datetime(cast('2021-08-11' as timestamp),'yyyyMMdd')

不帶杠日期轉帶杠

Hive Presto
get_date('2021-08-28') format_datetime(parse_datetime('20210828', 'yyyyMMdd'), 'yyyy-MM-dd')
  • cast只能識別'2021-08-28'的這種帶杠日期格式,因此用parse_datetime來轉換

URL提取

URL知識

一個URL由以下幾部分組成:scheme://host:[port]/path/[;parameters]?query-string=xxx#anchor

協議部分(scheme)

URL的協議部分為 "http:",這代表網頁使用的是 HTTP 協議。在 Internet 中可以使用多種協議,如HTTP,FTP等等。

域名(主機)部分(host)

主機名,域名,比如www.baidu.com

端口部分(port)

跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口。當你訪問一個網站的時候,瀏覽器默認使用80端口。

查找路徑(path)

查找路徑。比如:https://zhuanlan.zhihu.com/p/260660023,后面的/p/260660023就是path

query-string

查詢字符串,比如:www.baidu.com/s?wd=python,后面的wd=python就是查詢字符串

parameter

參數,如果要向服務器傳入參數,在這部分輸入

提取URL host

Hive Presto
parse_url('http://www.vip.com/1111?tagId=dress', 'HOST') url_extract_host('http://www.vip.com/1111?tagId=dress')
  • 其實presto同樣可以使用parse_url函數

提取URL path

Hive Presto
parse_url('http://www.vip.com/1111?tagId=dress', 'PATH') url_extract_path('http://www.vip.com/1111?tagId=dress')
  • 其實presto同樣可以使用parse_url函數

提取URL query

Hive Presto
parse_url('http://www.vip.com/1111?tagId=sport', 'QUERY') url_extract_query('http://www.vip.com/1111?tagId=dress')
  • 其實presto同樣可以使用parse_url函數

提取URL parameter

Hive Presto
parse_url('http://www.vip.com/1111?tagId=sport', 'QUERY', 'tagId') url_extract_parameter('http://www.vip.com/1111?tagId=dress', 'tagId')
  • presto不支持parse_url的tagId

正則提取

正則知識

字符集合

字符 匹配字符
\d 從0-9的任一數字
\D 任一非數字字符
\w 任一單詞字符,包括A-Z,a-z,0-9和下划線
\W 任一非單詞字符
\s 任一空白字符,包括制表符,換行符,回車符,換頁符和垂直制表符
\S 任一非空白字符
. 任一字符

字符簇

字符簇 描述
[[:alpha:]] 任何字母
[[:digit:]] 任何數字
[[:alnum:]] 任何字母和數字
[[:space:]] 任何空白字符
[[:upper:]] 任何大寫字母
[[:lower:]] 任何小寫字母
[[:punct:]] 任何標點符號
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]

邊界集合

字符 描述
^ 每一行的開頭,單行模式下等價於字符串的開頭
$ 每一行的結尾,單行模式下等價於字符串的結尾

重復次數集合

貪婪模式會獲取盡可能多的字符,而非貪婪模式會獲取盡可能少的字符

貪婪 非貪婪 描述
* *? 零次或多次
? ?? 零次或一次
+ +? 一次或多次
{m} {m}? 正好m次,貪婪與非貪婪一樣的
{m,} {m,}? 至少m次
{m, n} {m, n}? 最少m最多n次

組合操作符

優先級比較:圓括號>重復次數操作符>和>或

組合操作符 描述
[...] 方括號內任意字符或字符集合中的一個
[^…] 方括號內^為第一個字符時,表示與其后所有字符都不匹配的字符
(…) 圓括號,將復雜表達式當作單一表達式來處理
…|…
abc 和,直接將字符連在一起寫

匹配操作符

匹配操作符 描述
\n 即后向引用。n為1~9,標識由圓括號里取得的匹配字符串。方向是從左到右在regexp_replace函數中,允許在模式表達式和替換表達式中都使用\n

正則提取 -首次

Hive Presto
regexp_extract('http://www.vip.com-123456-4321html', '(\D*)(\d+)', 2) url_extract_query('regexp_extract('http://www.vip.com-123456-4321html', '(\D*)(\d+)', 2)')
  • 正則提取-首次的函數在Hive和Presto是相通的
  • 語法:regexp_extract(string subject, string pattern, int index)
  • 返回值:string
  • 說明:將字符串subject按照pattern正則表達式的規則拆分,返回index指定的字符。
  • 第一參數:要處理的字段
  • 第二參數:需要匹配的正則表達式
  • 第三個參數:
    • 0是顯示與之匹配的整個字符串
    • 1是顯示第一個括號里面的
    • 2是顯示第二個括號的字段
regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',0),  
-- x=18abc

regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','^x=([a-z]+)([0-9]+)',0), 
-- x=a3
 
regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',0),    
-- id=522228774076

regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',1),    
-- 522228774076
 
regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',0),            
-- i41915173660

regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',1)             
-- 41915173660

json提取

Hive Presto
get_json_object(activity_property,'$.brandlist') json_extract_scalar(activity_property,'$.brandlist')
  • json_extract_scalar返回varchar類型
  • json_extract(activity_property,'$.brandlist') 返回json類型

字符串轉換

字符串截取

Hive Presto
substr('string' ,1,3) substr('string' ,1,3)
  • Hive可用substring()/substr(),Presto只能用substr()
  • 轉換后的結果為:'str'

字符首次出現位置

Hive Presto
instr('abcdefg', 'cd') strpos('abcdefg', 'cd') /position('cd' IN 'abcdefg')
  • 轉換后的結果為:3

字符串拼接

Hive Presto
concat('goods_name','','brand_store_name','','new_category_3rd_name') concat('goods_name','','brand_store_name','','new_category_3rd_name')
  • Hive和Presto相同
  • 輸出結果:goods_name_brand_store_name_new_category_3rd_name

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM