云梯数据测试的小陷阱——NULL值问题

上一篇 / 下一篇  2012-08-07 09:43:23 / 个人分类:杂谈

1D@X"Z Ja`n0  最近在测试开发同学产出的一份新的算法数据时,遇到了这样一个奇怪现象,追寻了一下其中原因,感觉有点小收获,写一篇blog记录一下,并分享给需要的同学。

r+q@5u r1m\,T]0

n+e+ce2YY G0  问题描述:

k/k)a [#k"HTj!H051Testing软件测试网!@E;s8J T(Z:}8v

   算法同学在构建基于用户购买力的决策模型时,产出了一份基础数据,用来计算一周内,登录淘宝的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值在云梯上到底是如何存储的呢?为什么所见不为所得呢?

/O4va0\:v0

&s(ZSY)o Y0  做了一个小实验证明了下我的猜测:51Testing软件测试网K})X&?&h'q

51Testing软件测试网S)PW ^Z Iy6V

  1:在云梯生成一张临时表,并插入一条空记录

r!X#ajSdR0

5i7B.Y8sV0 drop table t_minyi_tmptest;51Testing软件测试网E_.N!?oqU8o
         create  table if not exists  t_minyi_tmptest (51Testing软件测试网$A6{)] |d
                cookie  string51Testing软件测试网(l8E0~1Z,o%p FtZ^P
          )51Testing软件测试网 [BM&O\ [?
         row format delimited51Testing软件测试网+z5l5?sU4PVR.R xX
         fields terminated by '\t'
Q H)\n*L y0         stored as SEQUENCEFILE
'W'A/x'g5@)^ h8R0         location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';
51Testing软件测试网,Z7t c l Gh.Xr

51Testing软件测试网o,Ub%@*L3||7Yz

         insert overwrite table t_minyi_tmptest select NULL from dual;

f.Wty8O+Q8k$Br!i0

"b)k8[LHU0

  2:查看这张表在云梯上究竟是如何存储的?

7o*S&e/GT]n0
hadoop fs -text '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest/*';

6b['`yDTo0

   可以看到直接查看云梯的存储结果,发现将空记录存储为"\N".hive里强制置空的符号是'\N',空是没有显示的,但字符长度length(\N) 并不等于0。此刻就联想到,由于这个原因是不是很多底层的基础数据,本身是"\N"怎么办呢?会不会被误认为NULL呢?

U O*q~2f(STr%y0

  3:再次做实验,看看是不是可以将NULL值用其他字符代替?

-u F#J;Y jnc0drop table t_minyi_tmptest;51Testing软件测试网8Xg ynVSt$C'`k
create  table if not exists  t_minyi_tmptest (
:Q?+gr"KX0cookie  string51Testing软件测试网iV8@ ]%YfC
)51Testing软件测试网Sd1lI0xz)~C
row format delimited51Testing软件测试网]E*dj[{
fields terminated by '\t'51Testing软件测试网Od9xt? U?
stored as SEQUENCEFILE51Testing软件测试网2T m/^K B X_6`
location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';51Testing软件测试网Z]Q G%C e@n*m z [
ALTER TABLE t_minyi_tmptest SET SERDEPROPERTIES ('serialization.null.format'='minyi');
&{dM*s(\wFk)n0insert overwrite table t_minyi_tmptest select NULL from dual;
7W l4VX'rQ"S0

51Testing软件测试网X)^X*Y/[,K~k

  查看t_minyi_tmptest表的存储是否发生的变化:hadoop fs -text '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest/*';51Testing软件测试网;j*^;nav8t/b(j*I

51Testing软件测试网]x-qC`

  结果为该表的null值存储为我制定的字符串内容。解决了hive默认存储NULL值为'\N'的问题。51Testing软件测试网8B t6d'L_ }%n2cN(O

  4:再次联想了下,会不会在云梯上一些基础数据表也需要做这种空置的处理呢?找了一些最基础的表看了下,例如“r_auction_auctions”的算法代码,果然开发做了处理。

`6k`:rI"iL0

51Testing软件测试网d1R$LOL'n

  结论:在云梯上测试数据的时候,需要关注到NULL值的情况,当hive脚本查询key is null没有记录的情况下,不一定真的没有结果。需要关注到开发的代码是否对空值做了处理。以免测试造成遗漏,导致脏数据的产生。51Testing软件测试网2RvG B$F2AT e;^


a ^|UMLiy0

TAG:

 

评分:0

我来说两句

Open Toolbar