我正在创建一个表并插入如下数据
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' ;
关于这种情况为什么发生以及如何解决的任何解释?我需要不使用修剪的结果
请注意,此问题仅在OR条件下发生。如果我运行下面的查询,我会得到结果
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或文本格式的表格,那么我得到的结果将不进行修剪。
答案 0 :(得分:1)
我设法重新解决了您的问题,并获得了与您所说的相同的结果。
我运行查询以查看您的条件到底产生了什么:
SELECT
T.*,
length(INS_UPD_FLAG),
length(trim(INS_UPD_FLAG)),
SEQ_NUM <> 0,
INS_UPD_FLAG = 'I',
SEQ_NUM <> 0 or INS_UPD_FLAG = 'I'
FROM mydb.mytable T
结果如下:
|seq_num|ins_upd_flag|_c1|_c2|_c3 |_c4 |_c5 |
|10457 |I |1 |1 |true|true|true|
|10462 |I |1 |1 |true|true|true|
|10461 |I |1 |1 |true|true|true|
|10460 |I |1 |1 |true|true|true|
|10459 |I |1 |1 |true|true|true|
|10456 |I |1 |1 |true|true|true|
|10458 |I |1 |1 |true|true|true|
如您所见,它为您的加入条件返回了true
。
出于好奇,我将where条件包裹在()
周围,并得到了没有修剪的结果。
SELECT
T.*,
length(INS_UPD_FLAG),
length(trim(INS_UPD_FLAG)),
SEQ_NUM <> 0,
INS_UPD_FLAG = 'I',
SEQ_NUM <> 0 or INS_UPD_FLAG = 'I'
FROM mydb.mytable T
where (SEQ_NUM <> 0 or INS_UPD_FLAG = 'I')
结果:与上一个查询相同。
我正在通过Hue 2.6.1-227使用Hive 1.2.1000。
我不知道()
在做什么,为什么查询没有它就无法工作。
答案 1 :(得分:0)
第一件事是我不确定为什么您没有看到预期的结果。我在下面进行了非常类似的测试,并收到了预期的结果。您正在使用哪个版本的Hive?我在hive-1.1.0 + cdh5.13.3 + 1307(Cloudera distro w / v5.13)上进行了相同的测试:
CREATE TABLE test_cond_parq
(
seq_num decimal(10,0),
ind string
)
STORED AS PARQUET;
INSERT INTO TABLE test_cond_parq
SELECT 10457, 'I' UNION ALL
SELECT 10458, 'I'
;
然后我运行以下查询,类似于上面的查询...
SELECT *, LENGTH(ind) len_ind, LENGTH(TRIM(ind)) len_trim_ind
FROM test_cond_parq
WHERE seq_num <> 0 OR ind <> 'I';
这返回了以下结果:
10457 | I | 1 | 1
10458 | I | 1 | 1
答案 2 :(得分:0)
我想知道为什么你不想使用修剪功能的原因。当hadoop将数据存储在文件中时,有很多机会可以在插入时增加空间。我使用parque格式时很多时间遇到了这个问题.it有时您会面对它,而有时您不会面对。 无论它是什么,您都可以根据这种情况运行查询 SELECT T. *,长度(INS_UPD_FLAG),长度(trim(INS_UPD_FLAG)) 从mydb.mytable T SEQ_NUM <> 0
if it is not returning anything the way data inserted is wrong..please try it let me know