1. 程式人生 > 其它 >2021-01-20 hive-分割槽欄位操作+double 轉int

2021-01-20 hive-分割槽欄位操作+double 轉int

技術標籤:hivesqlhivehadoopsparkhdfs

hive 分割槽簡單操作 + double 轉int

目錄

1、分割槽

2、double 轉int


大資料難免要進行分割槽,這樣可以方便針對性處理。

個人工作經歷:我們將資料抽到hive後,會根據抽數日期對其進行分割槽,在建表時候就會新增分割槽欄位

1、分割槽

create table if not exists 表名(
欄位名 型別 comment'欄位註釋',
name string comment'姓名'
)
comment '表註釋'
partitioned by (pt string) --分割槽欄位 pt  型別string
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
STORED AS orc     --格式

那麼在匯入資料的時候就會對一張表的指定分割槽插入資料

insert overwrite table 表名 partition(pt='${pt}')  --待插入表
select 
 欄位名
,name
from 表名  --資料來源表

分割槽的作用相當於加了一個pt欄位,方便增量抽取、後期補數、指定分析等,優點很多的。

2、double 轉int 型別轉換函式 cast(欄位,目標型別)

分割槽有這麼多的優點,與之帶來的便捷和承擔的責任有關,後期實際操作中遇到會持續跟新;下面描述一個需求+解決辦法

產生需求的原因是新年的第一個月,需求部門會統計一些去年十二月資料錄入源資料庫並且這種操作不可避免,但是我們現有的補數任務是當天凌晨補前一天的資料,例如2021年1月1日會補2020年12月31日的資料,以此類推,所以這也導致在補數的時間後,對2020年12月31日新增的新資料就無法繼續錄入。所以我們將對牽扯的任務在每年的一月份對去年12月31日進行補數。

將需求歸納後,就是對上圖匯入的分割槽欄位進行處理,對應關係

欄位原始資料(string)需求欄位(string)
pt2021010220201231
pt2021010320201231

思路:擷取pt前四個字元獲取當前年--a,a減去1得到去年--b,將b與1231拼接得需求欄位,上測試程式碼

SELECT DISTINCT pt,concat(substr(pt,1,4)-1,1231)  from 表名;--測試用的都是真實表,所以就把表名隱藏了

相信大家也看到了異常,substr(pt,1,4)-1 直接加減已經將結果變成了double型別,這種情況在實際開發中很常見,這時候就需要藉助型別轉換函式cast()將小數給去掉

SELECT DISTINCT pt,concat(cast(substr(pt,1,4)-1 as int),1231)  from 表名;--可不要直接轉string那樣無法去掉小數點,換成術語講就是將浮點型轉換成整型就可去掉小數點
--cast(欄位,資料型別)  將欄位轉換成後邊的型別

這樣就可實現我們想要的操作了,當然我們可以用時間函式來操作,但是對於這種是字串的,來回轉換比較耗費時間,上面的操作,簡單粗暴硬道理!