我正在创建一个表并插入如下所示的数据
CREATE TABLE `mydb.mytable`(
`seq_num` decimal(18,0),
`ins_upd_flag` char(1)
)
stored as parquet;
INSERT OVERWRITE TABLE mydb.mytable
SELECT 10457 SEQ_NUM,'I' INS_UPD_FLAG UNION ALL
SELECT 10462,'I' UNION ALL
SELECT 10461,'I' UNION ALL
SELECT 10460,'I' UNION ALL
SELECT 10459,'I' UNION ALL
SELECT 10456,'I' UNION ALL
SELECT 10458,'I';
正如您在上面看到的,第二列值只是'i',它没有任何额外的字符。
当我运行以下查询时,它不会产生任何结果
SELECT T.*, length(INS_UPD_FLAG), length(trim(INS_UPD_FLAG))
FROM mydb.mytable T
WHERE SEQ_NUM <> 0 OR INS_UPD_FLAG <> 'I' ;
但是,如果我运行下面的查询,它会按预期返回所有插入的行
SELECT T.*, length(INS_UPD_FLAG), length(trim(INS_UPD_FLAG)) -- both length =1
FROM mydb.mytable T
WHERE SEQ_NUM <> 0 OR TRIM(INS_UPD_FLAG) <> 'I' ;
关于为什么会发生这种情况以及如何解决这个问题有什么解释吗?我需要不使用trim的结果
请注意,此问题仅在有或有条件的情况下发生。如果我运行下面的查询,就会得到结果
SELECT T.*, length(INS_UPD_FLAG), length(trim(INS_UPD_FLAG))
FROM mydb.mytable T
WHERE SEQ_NUM <> 0 and INS_UPD_FLAG = 'I' ;
另外,如果我用orc或文本格式创建表,我得到的结果没有修剪。
3条答案
按热度按时间wb1gzix01#
请问您不想使用trim函数的原因是什么?由于hadoop将数据存储在文件中,因此在插入时很有可能会增加空间。我在使用parque格式时经常遇到这个问题。这取决于有时您会遇到,有时您不会遇到。无论它是什么,您都可以运行查询,仅基于此条件从mydb.mytable t中选择t.*、length(ins\u upd\u flag)、length(trim(ins\u upd\u flag)),其中seq\u num<>0
au9on6nz2#
我设法重新支持你的问题,并得到了与你所解释的相同的结果。
我运行了一个查询来查看您的where条件究竟产生了什么:
结果如下:
正如你所看到的,它正在回归
true
你的加入条件。出于好奇,我把这张照片包了起来
()
结果没有修剪。结果:与上一个查询相同。
我正在使用hive 1.2.1000 via hue 2.6.1-227。
我不知道什么魔法
()
以及为什么查询在没有它的情况下不能工作。jw5wzhpr3#
第一件事是,我不知道为什么你没有看到预期的结果。我在下面进行了一个非常类似的测试,得到了预期的结果。你用的是什么版本的Hive?我在hive-1.1.0+cdh5.13.3+1307(cloudera发行版w/v5.13)上做了相同的测试:
然后我运行了下面的查询,类似于上面的查询。。。
返回以下结果: