蜂巢-实木复合地板格式-OR子句无法按预期运行

时间:2018-11-22 18:38:18

标签: hive hiveql hadoop2

我正在创建一个表并插入如下数据

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或文本格式的表格,那么我得到的结果将不进行修剪。

3 个答案:

答案 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
相关问题