【问题标题】:Hive: handle negative number in data stored in HDFSHive:处理存储在 HDFS 中的数据中的负数
【发布时间】:2016-12-05 13:24:34
【问题描述】:

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

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

在 hive 中我必须运行一些算术操作,比如我想要 SUM 这个包含像“12345-”这样的数据的值,然后 HIVE 无法将此值识别为数字(列类型为 DECIMAL(10,2))结果显示 NULL 作为值!需要您提出如何处理这种情况的建议。在此先感谢。

【问题讨论】:

  • 首先将您的数据类型更改为String,然后您将能够在该丑陋的SAP 格式上使用字符串函数并生成您可以cast(... as decimal(10,2)) 的东西

标签: hadoop hive integer hdfs negative-number


【解决方案1】:

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

【讨论】:

  • 感谢您的回复!这不起作用,输出在 Hive 中仍然显示 NULL。
  • 部分调试。第一次检查select substr(your_column,-1,1) 返回的内容。第二个:检查select cast(concat('-',substr(your_column,1,length(your_column)-1)) as int) 返回,第三个:检查最后一个select cast(your_column as int)。也许它无法转换为 int (cast function),因为存在非 int 值,可能是 double、bigint 或其他?
  • @leftjoin:你的方法可以工作如果原来的列是一个字符串,但它已经被f...作为一个十进制(阅读问题再次)。因此NULL。除了首先更改表定义之外,没有办法摆脱这种混乱。
  • 当然,我完全同意你的看法。需要先改变表定义
  • 谢谢@leftjoin 和@Samson!我现在能够处理我的蜂巢查询中的负数,您的回答和回复让我对更复杂的问题有了更多的了解。
【解决方案2】:

使用这个语法:

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

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2013-11-05
    • 2016-08-31
    • 2015-01-09
    • 1970-01-01
    • 2016-03-19
    • 2016-06-13
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多