背景
hive 中有一張待處理的分區(qū)表,存儲的方式是parquet鱼鸠,處理之后的目標表是一張非分區(qū)的外部表猛拴,并且分隔方式為 “,”。
問題
部分記錄的 int 類型字段 出現(xiàn) null 情況
表結(jié)構(gòu)
原表結(jié)構(gòu)
CREATE EXTERNAL TABLE
adm_v1.adm_cms_flow_daily
(
url
string,
title
string,
courseeduid
string,
courseeduname
string,
catalogid
string,
catalogname
string,
innercode
string,
adduser
string,
addtime
string,
original
string,
pv
string,
uv
string,
downuv
string,
downpv
string,
platform
string,
areaid
string
)
PARTITIONED BY (
dn
string,
dt
string)
stored as parquet
TBLPROPERTIES ('parquet.compression'='gzip');
目標表結(jié)構(gòu)
CREATE EXTERNAL TABLE
tmp_v1.tmp_zdh_test_biz_cms_flow_tmp_v4
(
dt
string,
dn
BIGINT,
addtime
BIGINT ,
adduser
string,
innercode
string,
url
string,
title
string,
original
BIGINT,
timestamp
TIMESTAMP,
pv
BIGINT,
uv
BIGINT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
處理語句
insert overwrite table tmp_v1.tmp_zdh_test_biz_cms_flow_tmp_v4
select from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyy-MM-dd') as dt,case dn when 'acc' then 1 when 'jianshe' then 2 when 'med' then 3 else 4 end as dn1,addtime,adduser,innercode,url,title,cast(original as bigint ),from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss'),cast(pv as bigint),cast(uv as bigint) from adm_v1.adm_cms_flow_daily where dn='acc' and dt='20201110' and addtime='20201110' ;
問題展示
原表中的original 字段 存在 1 的值
導(dǎo)入到tmp_v1.tmp_zdh_test_biz_cms_flow_tmp_v4表之后 original 字段變?yōu)閚ull 值
問題分析/定位
將有問題的記錄取出蚀狰,觀察數(shù)據(jù)愉昆,要特別注意一下original 的前一個字段是title,title 中可能存在逗號影響目標表的存儲。
查詢原表中記錄
查詢目標中記錄
從上面兩個查詢結(jié)果對比可以看出麻蹋,title 字段在逗號的位置被截斷了撼唾。這樣問題就找到了,替換目標表的分隔符為 \u0001哥蔚。 重新觀察
CREATE EXTERNAL TABLE
tmp_v1.tmp_zdh_test_biz_cms_flow_tmp_v8
(
dt
string,
dn
BIGINT,
addtime
BIGINT ,
adduser
string,
innercode
string,
url
string,
title
string,
original
BIGINT,
pv
BIGINT,
uv
BIGINT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001' ;
問題解決倒谷。
引出的問題
最后一列跑哪去了?
測試:最后兩列是pv糙箍、uv渤愁,從下圖看出來,最后一列被舍棄了深夯。
本文由博客群發(fā)一文多發(fā)等運營工具平臺 OpenWrite 發(fā)布