當下hadoop和其他NoSQL數據庫為什么如此流行的一個原因是他們采用的是schema on read策略,而非傳統關系型數據庫的schema on write。傳統的數據庫嚴格要求數據的schema。數據的列數,每列的字段類型在創建開始都嚴格規定,因此,你需要時刻按照數據的格式來存儲。Hive和其他一些非關系型數據庫事先對數據的格式和具體內容並不關心,只有當數據被讀出的時候才會應用schema。這樣帶來的好處是你實現可以先存儲你的數據,直到當你要分析你數據時再靈活指定需要的schema。
那么當hive中出現數據類型不對時會出現什么狀況?
hive數據類型
基本數據類型:tinyint, smallint, int,bigint, boolean, float, double, string
復雜數據類型:struct,map,array
hive對數據類型的檢查
數據導入時不進行類型檢查,不支持schema on write
數據讀取時會進行類型檢查,支持schema on read,
如果類型異常,會將字段復制為NULL
hive> select * from hequn_xxx; OK 521460020740 9787506042946 521460020939 9787506043946 521460020954 9787517026686 521460021042 4324234324324 521460021271 9787511023681 NULL NULL 521460021908 321432 521460022134 3123412312 521460022166 7544012476
我們又改如何進行處理呢?如果不處理數據流向下游可能造成問題的延伸,這樣當問題出現時不利於查找問題的根源。所以讀取數據的時候需要對數據進行檢查。
1.將null賦為其他值。
case when aid is null then cast('111' as bigint) else aid end
2.遇到null時直接退出。hive的內建函數assert_true()當條件為false時會拋出異常。
assert_true(aid is not null)
3.對於更復雜的格式檢查可以通過自定義UDF來檢查。