關(guān)于Hive中的NULL空值處理問題
HIVE表中默認(rèn)將NULL存為\N,可查看表的源文件(hadoop fs -cat或者h(yuǎn)adoop fs -text),文件中存儲大量\N,這樣造成浪費(fèi)大量空間。而且用java、python直接進(jìn)入路徑操作源數(shù)據(jù)時(shí),解析也要注意。
另外,hive表的源文件中,默認(rèn)列分隔符為\001(SOH),行分隔符為\n(目前只支持\n,別的不能用,所以定義時(shí)不需要顯示聲明)。元素間分隔符\002,map中key和value的分隔符為\003。
舉例,如源文件中一條記錄為:
10000042SOH77SOH435SOH16SOH22SOH1156120000SOH\NSOH\NSOH\NSOH\NSOH\NSOH\NSOH\NSOHyoukuSOH85133.0SOH111
可以看出存儲NULL的\N 浪費(fèi)了大量空間。
但hive的NULL有時(shí)候是必須的:
- 1)hive中insert語句必須列數(shù)匹配,不支持不寫入,沒有值的列必須使用null占位。
- 2)hive表的數(shù)據(jù)文件中按分隔符區(qū)分各個(gè)列。空列會(huì)保存NULL(\n)來保留列位置。但外部表加載某些數(shù)據(jù)時(shí)如果列不夠,如表13列,文件數(shù)據(jù)只有2列,則在表查詢時(shí)表中的末尾剩余列無數(shù)據(jù)對應(yīng),自動(dòng)顯示為NULL。
所以,NULL轉(zhuǎn)化為空字符串,可以節(jié)省磁盤空間,實(shí)現(xiàn)方法有幾種
1)建表時(shí)直接指定(兩種方式)
a、用語句
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'with serdeproperties('serialization.null.format' = '')
實(shí)現(xiàn),注意兩者必須一起使用,如
CREATE TABLE hive_tb (id int,name STRING) PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint) ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( ‘field.delim'='/t', ‘escape.delim'='//', ‘serialization.null.format'='' ) STORED AS TEXTFILE;
b、或者通過ROW FORMAT DELIMITED NULL DEFINED AS '' 如
? ?CREATE TABLE hive_tb (id int,name STRING) ? ?PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint) ? ?ROW FORMAT DELIMITED? ? ? ? ? NULL DEFINED AS ''? ? ?STORED AS TEXTFILE;
2)修改已存在的表
alter table hive_tb set serdeproperties('serialization.null.format' = '');
節(jié)省空間的驗(yàn)證結(jié)果如下:
hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
1137
hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
319753
-----------------------------------
hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
885
hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
249529
到此這篇關(guān)于關(guān)于Hive中的NULL空值處理問題的文章就介紹到這了,更多相關(guān)Hive中的NULL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL與Oracle 差異比較之四條件循環(huán)語句
這篇文章主要介紹了MySQL與Oracle 差異比較之四條件循環(huán)語句,需要的朋友可以參考下2017-04-04sql語句創(chuàng)建外鍵關(guān)聯(lián)的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于sql語句創(chuàng)建外鍵關(guān)聯(lián)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03PostgreSQL數(shù)據(jù)庫服務(wù)端監(jiān)聽設(shè)置及客戶端連接方法教程
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫服務(wù)端監(jiān)聽設(shè)置及客戶端連接方法,需要的朋友可以參考下2014-07-07最新DataGrip2020.2.x破解版激活碼的步驟詳解(支持Mac/Windows/Linux)
這篇文章主要介紹了最新DataGrip2020.2.x破解版激活碼教程詳解(支持Mac/Windows/Linux),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Navicat保存查詢和查詢文件放在哪個(gè)位置最佳方法推薦
這篇文章主要介紹了Navicat保存查詢和查詢文件放在哪個(gè)位置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08