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

发表于:2012-8-06 11:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:minyi    来源:TaoBao QA Team

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

  问题描述:

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

  做了一个小实验证明了下我的猜测:

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

 drop table t_minyi_tmptest;
         create  table if not exists  t_minyi_tmptest (
                cookie  string
          )
         row format delimited
         fields terminated by '\t'
         stored as SEQUENCEFILE
         location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';

         insert overwrite table t_minyi_tmptest select NULL from dual;

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

hadoop fs -text '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest/*';

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

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

drop table t_minyi_tmptest;
create  table if not exists  t_minyi_tmptest (
cookie  string
)
row format delimited
fields terminated by '\t'
stored as SEQUENCEFILE
location '/group/tbdataapplication-dev/hive/minyi/t_minyi_tmptest';
ALTER TABLE t_minyi_tmptest SET SERDEPROPERTIES ('serialization.null.format'='minyi');
insert overwrite table t_minyi_tmptest select NULL from dual;

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号