Group By в Hive в секционированной таблице дает повторяющиеся строки результатов

Использование версии 0.11.0. Я получаю неправильные результаты при попытке выполнить этот запрос

select t1.symbol, max(t1.maxts - t1.orderts) as diff from 
    (select catid, symbol, max(cast(timestamp as double)*1000) as maxts, min(cast(timestamp as double)*1000) as orderts, count(*) as cnt 
        from cat where recordtype in (0,1) and customerid=srcrepid group by symbol, catid) t1
where t1.cnt > 1
group by t1.symbol;

Как видите, есть подзапрос с оператором group by. Этот подзапрос вычисляет максимальное и минимальное значение временной метки для MYID и SYMBOL.

Теперь у меня есть 24 символа. Во внешнем запросе я хочу найти максимальную разницу для SYMBOL, поэтому я группирую по SYMBOL.

Проблема в том, что это возвращает 864 строки результатов прямо сейчас. Улей, кажется, не может уменьшить последний результат до того, что я ожидал увидеть.

Это ошибка? Кто-нибудь может воспроизвести это? У меня работает 6 узлов с 4 символами на узел.

Используемая таблица:

create table cat(CATID bigint, CUSTOMERID int, FILLPRICE double, FILLSIZE int, INSTRUMENTTYPE int, ORDERACTION int, ORDERSTATUS int, ORDERTYPE int, ORDID string, PRICE double, RECORDTYPE int, SIZE int, SRCORDID string, SRCREPID int, TIMESTAMP timestamp) PARTITIONED BY (SYMBOL string, REPID int) row format delimited fields terminated by ',' stored as ORC;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
hive.exec.max.dynamic.partitions.pernode=1000;

Отредактировано: отредактировано, потому что запрос не соответствовал фактической используемой таблице, что затрудняло предоставление какой-либо помощи...


person UmaN    schedule 15.09.2013    source источник


Ответы (3)


Как объяснил Инь в улье список рассылки это ошибка, связанная с этим ошибка.

Когда Hive использует только одно задание mapreduce, используются оба столбца разделения, тогда как мой запрос хотел бы группировать только по символу.

Очевидно, эта ошибка была исправлена ​​в транке.

А вот еще один отчет об ошибке, который более наглядно демонстрирует проблему.

person UmaN    schedule 17.09.2013

Я думаю, это может сработать, если во внешнем запросе вы структурируете его следующим образом:

ВЫБЕРИТЕ t1.symbol, max(t1.maxts) - min(t1.orderts) AS diff, ....

person spfister    schedule 15.09.2013
comment
Я попробую это, когда у меня будут машины. Благодарим вас за вклад. - person UmaN; 16.09.2013

Я видел, что если вы вводите предложение ORDER BY, оно после первого GROUP BY принудительно разделяет куст на два задания MR и дает правильные результаты.

По запросу добавление модификации запроса в качестве примера.

выберите t1.symbol, max(t1.maxts - t1.orderts) как diff from (выберите catid, symbol, max(cast(timestamp as double)*1000) as maxts, min(cast(timestamp as double)1000 ) как заказы, count() как cnt from cat, где тип записи в (0,1) и customerid=srcrepid группировка по символу, catid ORDER BY symbol, catid) t1, где t1.cnt > 1 группа по t1.symbol;

Но да, это все еще только работа над проблемой, но реальная проблема заключается в том, что Hive использует неправильные поля разделения в этом запросе, он должен был просто использовать символ, но если вы видите объяснение того, что он использует как символ, так и catid, что вызывает это чтобы дать несколько результатов.

Добавление ORDER BY заставляет Hive выполнять вторую группу в другом задании MR, что дает нам правильные результаты.

person Pavan Lanka    schedule 03.06.2014
comment
Похоже, это может быть хорошим ответом, не могли бы вы отредактировать и показать больше деталей, которые помогут напрямую ответить на вопрос? - person xlm; 04.06.2014