云梯数据测试的小陷阱——NULL值问题
上一篇 /
下一篇 2012-08-07 09:43:23
/ 个人分类:杂谈
|9Yo.@NRS0 最近在测试开发同学产出的一份新的算法数据时,遇到了这样一个奇怪现象,追寻了一下其中原因,感觉有点小收获,写一篇blog记录一下,并分享给需要的同学。
#D"\0y:C1T&|n09\'U;txvz0 问题描述:51Testing软件测试网yZ{q uX
51Testing软件测试网1y:H
T5]/j9q%ft
IN
算法同学在构建基于用户购买力的决策模型时,产出了一份基础数据,用来计算一周内,登录淘宝的cookie信息和其浏览的宝贝数据。在测试的过程中发
现,这份数据存在关键key(用户登录淘宝网的cookie)为空的情况。查看开发的代码发现,在算法处理时,并没有对原始表进行脏数据的清理。随后,我
想验证一下云梯上每日用户浏览信息这份基础数据到底有多少cookie记录为空的情况,就写了一条hive语句:“select count(1)
from r_***_log where pt=*** and mid is
null;"执行后惊奇的发现,居然一条结果都没有。但是执行"select * from r_***_log where pt=***
limit 100;" 是能看到一些key=cookie的空记录.再次换了一条计算hive"select count(1)from
r_***_log where pt=*** and mid ='
';结果是可以查询到的。这就让我联想到一个问题,null值在云梯上到底是如何存储的呢?为什么所见不为所得呢?51Testing软件测试网,U*nz^ M{
#O0w!WR%y0 做了一个小实验证明了下我的猜测:
1[p/bQ4~051Testing软件测试网!@ Hh2gL6xD 1:在云梯生成一张临时表,并插入一条空记录
-cHR/I0U(XA c!AX02pvZ4Cm#C0 drop table t_minyi_tmptest;51Testing软件测试网Y"A&T9[;ap&b create table if not exists t_minyi_tmptest ( q3LF9x ikUf0 cookie string koF I ~!sWT4oO0 ) RjnH.f(pm0 row format delimited d%E*u1R8L_:\ZU0 fields terminated by '\t' a,C&`8k Z0 stored as SEQUENCEFILE bL]3\$A)u8_H2D.H0 location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';51Testing软件测试网
^mo
G7l0RvMq LgqGn6y*t0 insert overwrite table t_minyi_tmptest select NULL from dual; !Vwt8mk0 |
Z F/NRAB
@Le0 2:查看这张表在云梯上究竟是如何存储的?
y5?'F!Xux4J0hadoop fs -text '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest/*'; |
b6s'o3^0u\7`C0
可以看到直接查看云梯的存储结果,发现将空记录存储为"\N".hive里强制置空的符号是'\N',空是没有显示的,但字符长度length(\N)
并不等于0。此刻就联想到,由于这个原因是不是很多底层的基础数据,本身是"\N"怎么办呢?会不会被误认为NULL呢?
q:?KY5R%e0 3:再次做实验,看看是不是可以将NULL值用其他字符代替?51Testing软件测试网7Q!\}:o2P,|a
drop table t_minyi_tmptest;51Testing软件测试网 s~V+d@&j_@qK
create table if not exists t_minyi_tmptest (51Testing软件测试网"a:`&W+M7c
o
cookie string51Testing软件测试网rH0Rg^A-CJy*Z
)
Xuw'uT$E(x/bk0row format delimited51Testing软件测试网7G4k;p;w5D S]
fields terminated by '\t'51Testing软件测试网JG3tI!w
yj
stored as SEQUENCEFILE
zZh1|4b2R2F0location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';51Testing软件测试网f/Xz
eV)YF
}6Q
`w
ALTER TABLE t_minyi_tmptest SET SERDEPROPERTIES ('serialization.null.format'='minyi');
f@1z(qq]0insert overwrite table t_minyi_tmptest select NULL from dual;
(s3^'o;D"JH4U8?,l9F051Testing软件测试网&@cIXq kJ
查看t_minyi_tmptest表的存储是否发生的变化:hadoop fs -text '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest/*';51Testing软件测试网bvyp3b
U3s2z|S
L
jH\$].w0 结果为该表的null值存储为我制定的字符串内容。解决了hive默认存储NULL值为'\N'的问题。
^(z2?$pE0 4:再次联想了下,会不会在云梯上一些基础数据表也需要做这种空置的处理呢?找了一些最基础的表看了下,例如“r_auction_auctions”的算法代码,果然开发做了处理。
S|.|3G}051Testing软件测试网+G"q"i&oAh]`J O `Ep
结论:在云梯上测试数据的时候,需要关注到NULL值的情况,当hive脚本查询key is null没有记录的情况下,不一定真的没有结果。需要关注到开发的代码是否对空值做了处理。以免测试造成遗漏,导致脏数据的产生。
JxeJm7u)q051Testing软件测试网'y$Ga)|
V%W'Xm}gT2^
收藏
举报
TAG: