Улей - Паркетный формат - ИЛИ предложение, где не работает, как ожидалось - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю таблицу и вставляю данные, как показано ниже

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

Любое объяснение, почему это происходит и как решить то же самое?Мне нужны результаты без использования обрезки

Обратите внимание, что эта проблема возникает только при условии ИЛИ.Если я запускаю приведенный ниже запрос, я получаю результаты

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 голосов
/ 23 ноября 2018

могу я знать причину, по которой вы не хотите использовать функцию обрезки. Поскольку hadoop хранит данные в файлах, есть много шансов, что он может добавить пространство при вставке. Я сталкивался с этой проблемой много времени при использовании формата parqueЭто зависит от того, иногда вы сталкиваетесь с этим, когда вы не сталкиваетесь с этим.что бы это ни было, вы можете выполнить свой запрос только на основе этого условия SELECT T. *, длина (INS_UPD_FLAG), длина (trim (INS_UPD_FLAG)) FROM mydb.mytable T WHERE SEQ_NUM <> 0

if it is not returning anything the way data inserted is wrong..please try it let me know
0 голосов
/ 24 ноября 2018

Мне удалось повторно проработать вашу проблему и получить те же результаты, которые вы объяснили.

Я выполнил запрос, чтобы посмотреть, что именно выдает ваше условие:

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

Результаты: те же, что и в предыдущем запросе.

Я использую Hive 1.2.1000 через Hue 2.6.1-227.

Надеюсьне знаю, что делает магия () и почему запрос не работает без нее.

0 голосов
/ 23 ноября 2018

Во-первых, я не уверен, почему вы не видите ожидаемых результатов.Я провел очень похожий тест ниже и получил ожидаемые результаты.На какой версии 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
...