場景描述: 公司埋點項目,數據從介面服務寫入kafka集群,再從kafka集群消費寫入HDFS文件系統,最後通過Hive進行查詢輸出。這其中存在一個問題就是:埋點介面中的數據欄位是變化,後續會有少量欄位添加進來。這導致Hive表結構也需要跟著變化,否則無法通過Hive查詢到最新添加欄位的數據。 解決 ...
場景描述:
公司埋點項目,數據從介面服務寫入kafka集群,再從kafka集群消費寫入HDFS文件系統,最後通過Hive進行查詢輸出。這其中存在一個問題就是:埋點介面中的數據欄位是變化,後續會有少量欄位添加進來。這導致Hive表結構也需要跟著變化,否則無法通過Hive查詢到最新添加欄位的數據。
解決辦法:
為數據表添加欄位,欄位必須添加到已有欄位的最後面。因為已經存在的數據是按照之前的表結構寫入到HDFS文件中的,當添加新欄位時為了能相容前面已經存在的數據。在新增的欄位加到分區表後,之前已經存在分區表中的數據會為這些新增的欄位賦予預設值NULL。
具體操作:
hive> show databases; //查詢當前所有資料庫 OK db_hive_test default Time taken: 0.014 seconds, Fetched: 2 row(s) Hive> use default; hive> show create table bp_rec_session; //顯示表結構及相關配置信息 OK CREATE TABLE `bp_rec_session`( `appversion` string, …… `cpucs` string) PARTITIONED BY ( `idate` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://x.x.x.x:9000/bp/rec_session' TBLPROPERTIES ( 'last_modified_by'='os', 'last_modified_time'='1519977809', 'parquet.compression'='SNAPPY', 'transient_lastDdlTime'='1519977809') Time taken: 0.024 seconds, Fetched: 65 row(s) hive> alter table bp_rec_session add columns(language string, loginType string); //為分區表添加language和loginType欄位 hive> show create table bp_rec_session; //查看修改後的表結構 OK CREATE TABLE `bp_rec_session`( `appversion` string, …… `cpucs` string, `language` string, `logintype` string) PARTITIONED BY ( `idate` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://x.x.x.x:9000/bp/rec_session' TBLPROPERTIES ( 'last_modified_by'='os', 'last_modified_time'='1519977809', 'parquet.compression'='SNAPPY', 'transient_lastDdlTime'='1519977809') hive> select * from bp_rec_session limit 1; //查詢表數據,檢驗對錶結構修改後是否還能查詢已經存在的數據 OK 7.2 …… Y0MDY2OA=e5d3= 8 NULL NULL 20180105 Time taken: 0.139 seconds, Fetched: 1 row(s)
上述查詢結果中的兩個"NULL"即為後面添加欄位賦予的預設值!