Hadoop 配置单元:处理HDFS中存储的数据中的负数

Hadoop 配置单元:处理HDFS中存储的数据中的负数,hadoop,hive,integer,hdfs,negative-number,Hadoop,Hive,Integer,Hdfs,Negative Number,我有处理负数数据的情况。文件中某些数值(存储在HDFS中)的负号位置在右侧(如图12345-),理想情况下负数在左侧表示为负数(如图-12345) 我无法更改数据,因为该数据是正确的,并且当源系统(SAP)使用该数据时,它能够将数据读取为负数 在配置单元中,我必须运行一些算术操作,比如我要求包含“12345-”等数据的此值的和,那么配置单元无法将此值识别为数字(列类型为DECIMAL(10,2)),结果显示NULL为值!需要您的建议如何处理这种情况。请提前感谢。检查最后一个字符,如果它是“-”,

我有处理负数数据的情况。文件中某些数值(存储在HDFS中)的负号位置在右侧(如图12345-),理想情况下负数在左侧表示为负数(如图-12345)

我无法更改数据,因为该数据是正确的,并且当源系统(SAP)使用该数据时,它能够将数据读取为负数


在配置单元中,我必须运行一些算术操作,比如我要求包含“12345-”等数据的此值的和,那么配置单元无法将此值识别为数字(列类型为DECIMAL(10,2)),结果显示NULL为值!需要您的建议如何处理这种情况。请提前感谢。

检查最后一个字符,如果它是“-”,然后使用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-”

检查最后一个字符,如果是“-”,则使用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-”替换为您的列名

使用以下语法:

CAST(CAST(-1为十进制(1,0))为
十进制(10,2))*转换为十进制(10,2)),
使用以下语法:

CAST(CAST(-1为十进制(1,0))为
十进制(10,2))*转换为十进制(10,2)),

谢谢您的回复!这不起作用,输出在配置单元中仍然显示NULL。请逐个调试。首先检查
选择substr(您的列,-1,1)
返回的内容。第二:检查
选择强制转换(concat('-',substr(你的_列,1,长度(你的_列)-1))作为int)
返回,第三:检查最后一个
选择强制转换(你的_列作为int)
。可能它无法转换为int(
cast function
),因为存在非int值,可能是double、bigint或其他值?@leftjoin:如果原始列是字符串,则您的方法可以工作,但它已被转换为。。。以小数点形式递增(再读一遍问题)。因此为空。除了先修改表的定义,没有办法摆脱这种混乱。当然,我完全同意你的观点。需要先更改表定义谢谢,@leftjoin和@Samson!我现在可以处理蜂巢查询中的负数了,您的回答和回复让我对一个更复杂的问题有了更多的了解。谢谢您的回复!这不起作用,输出在配置单元中仍然显示NULL。请逐个调试。首先检查
选择substr(您的列,-1,1)
返回的内容。第二:检查
选择强制转换(concat('-',substr(你的_列,1,长度(你的_列)-1))作为int)
返回,第三:检查最后一个
选择强制转换(你的_列作为int)
。可能它无法转换为int(
cast function
),因为存在非int值,可能是double、bigint或其他值?@leftjoin:如果原始列是字符串,则您的方法可以工作,但它已被转换为。。。以小数点形式递增(再读一遍问题)。因此为空。除了先修改表的定义,没有办法摆脱这种混乱。当然,我完全同意你的观点。需要先更改表定义谢谢,@leftjoin和@Samson!我现在能够处理我的配置单元查询中的负数,您的回答和回复让我更清楚地了解了一个更复杂的问题。首先将数据类型更改为
String
,然后您将能够在丑陋的SAP格式上使用String函数,并生成一些可以
转换为十进制(10,2))
首先将您的数据类型更改为
String
,然后您将能够在丑陋的SAP格式上使用字符串函数,并生成一些可以
转换(…作为十进制(10,2))