2016-01-04 2 views
0

Я пытаюсь преобразовать Pig BigDecimal в Dive Decimal, но значения gettined null. Вот пример кода:Pig BigDecimal to Hive decimal

Свиньи Сценарии:

a = LOAD 'test.txt' using TextLoader() as (col1:chararray,col2:int,col3:chararray,col4:int); 
    b = foreach a generate *,1 as rec_cnt; 
    c = group b by col1,col3; 
    d = foreach c generate flatten(group),(bigdecimal) SUM(rec_cnt) as grp_code; 
STORE d into 'user/test' Using PigStorage(','); 
STORE d into 'default.test' using org.apache.hive.hcatalog.pig.HCatStorer(); 

В приведенном выше коде, значение сумма записей отсчетов идет должным образом в файле HDFS хранится как «пользователь/тест». Но с HcatStorer в том же поле заполняется NULL для всех записей. Таблица тестов создается с этим определением столбца DECIMAL (16,0). Я использую Hive 1.1.0. Пожалуйста, попробуйте решить эту проблему.

+0

Любые сообщения? Вы смотрите на другие подобные вопросы здесь? –

+0

Почему вы храните целое число «1» в DOUBLE ??? И зачем подсчитывать записи (например, суммировать эти 1) в BIGDECIMAL ??? Использование LONG или BIGINTEGER будет иметь больший смысл ... –

+0

Конечный результат должен быть десятичным, так как нисходящий поток нуждается в нем в десятичном формате. Кастинг целого числа «1» для DOUBLE не нужен, я просто пытался использовать разные варианты для хранения окончательной суммы в десятичном формате, но он получает как NULL, каким образом я суммировал его в таблице hive. Обновлен код для удаления двойного литья. – HarishKotha

ответ

0

Я, наконец, понял причину null. Hcatalog делает проверку диапазона при преобразовании bigdecimal в свинье в десятичный в улье. Поскольку в определении улья нет шкалы (т. Е. DECIMAL (16,0)), при хранении во время проверки диапазона он по умолчанию имеет значение null. Когда я изменил определение Hive на DECIMAL (16,2), он становится правильно сохраненным. Таким образом, для изменения масштаба требуется изменение макета.