hive-parquet格式-or子句中的where未按预期工作

wmomyfyw  于 2021-06-27  发布在  Hive
关注(0)|答案(3)|浏览(312)

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

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或文本格式创建表,我得到的结果没有修剪。

wb1gzix0

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

if it is not returning anything the way data inserted is wrong..please try it let me know
au9on6nz

au9on6nz2#

我设法重新支持你的问题,并得到了与你所解释的相同的结果。
我运行了一个查询来查看您的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

结果如下:

|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 你的加入条件。
出于好奇,我把这张照片包了起来 () 结果没有修剪。

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')

结果:与上一个查询相同。
我正在使用hive 1.2.1000 via hue 2.6.1-227。
我不知道什么魔法 () 以及为什么查询在没有它的情况下不能工作。

jw5wzhpr

jw5wzhpr3#

第一件事是,我不知道为什么你没有看到预期的结果。我在下面进行了一个非常类似的测试,得到了预期的结果。你用的是什么版本的Hive?我在hive-1.1.0+cdh5.13.3+1307(cloudera发行版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

相关问题