Hive: обрабатывать отрицательные числа в данных, хранящихся в HDFS

У меня есть ситуация для обработки отрицательных числовых данных. Положение отрицательного знака для некоторых числовых значений в файлах (хранящихся в HDFS) находится справа (например, 12345-), идеально отрицательное число обозначается как минус слева (например, -12345).

Я не могу изменить данные, потому что эти данные верны, и когда данные используются исходной системой (SAP), она может считывать данные как отрицательное число.

В улье мне нужно выполнить некоторые арифметические манипуляции, скажем, я хочу, чтобы SUM эти значения содержали такие данные, как «12345-», тогда HIVE не может распознать это значение как число (тип столбца DECIMAL (10,2)) и результат показывает NULL как значение! Нужен ваш добрый совет, как справиться с этой ситуацией. Заранее спасибо.


person AndyD    schedule 05.12.2016    source источник
comment
Начните с изменения типа данных на String, тогда вы сможете использовать строковые функции в этом уродливом формате SAP и создавать что-то, что вы можете cast(... as decimal(10,2))   -  person Samson Scharfrichter    schedule 05.12.2016


Ответы (2)


Проверьте последний символ, если он '-', используйте substr и concat для создания правильного значения:

    select case when substr('12345-',-1,1)='-' then cast(concat('-',substr('12345-',1,length('12345-')-1)) as int) else cast('12345-' as int) end as column_name;
OK
-12345

Замените «12345-» на имя_столбца.

person leftjoin    schedule 05.12.2016
comment
Спасибо за ответ! Это не сработало, вывод по-прежнему показывает NULL в Hive. - person AndyD; 05.12.2016
comment
Отлаживайте его по частям. 1-й проверьте, что возвращает select substr(your_column,-1,1). 2-й: проверка select cast(concat('-',substr(your_column,1,length(your_column)-1)) as int) возвращается, 3-й: проверка последнего select cast(your_column as int). Может быть, его нельзя преобразовать в int (cast function), потому что есть значение, отличное от int, может быть, double, bigint или что-то еще? - person leftjoin; 05.12.2016
comment
@leftjoin: ваш подход сработал бы, если исходный столбец был строкой, но он уже был... обработан как десятичный (прочитайте вопрос еще раз). Следовательно, НУЛЬ. Нет выхода из этого беспорядка, кроме как сначала изменить определение таблицы. - person Samson Scharfrichter; 05.12.2016
comment
Если конечно, тут я с вами полностью согласен. Сначала нужно изменить определение таблицы - person leftjoin; 05.12.2016
comment
Спасибо, @leftjoin и @Samson! Теперь я могу обрабатывать отрицательное число в моем запросе улья, ваш ответ и ответ пролили свет на более сложную проблему. - person AndyD; 06.12.2016

Используйте этот синтаксис:

CAST(CAST(-1 AS DECIMAL(1,0)) AS
 DECIMAL(10,2))*CAST(regexp_replace(regexp_replace(TRIM(column name),'\\-',''),'-','') as decimal(10,2)),
person kizar syed    schedule 07.10.2019