【问题标题】:Can anyone please provide hive udf code for truncating particular column?任何人都可以提供用于截断特定列的 hive udf 代码吗?
【发布时间】:2016-10-19 04:49:39
【问题描述】:

我有一列包含双精度值 42.2223。我想截断这个特定列的最后四位数字。

任何人都可以为这个特定场景提供 hive UDF 吗?

【问题讨论】:

    标签: hive-udf


    【解决方案1】:

    如果您想截断最后四位数字并获得一个整数,您可以使用内置函数floor(double a)ceiling(double a),具体取决于您想要的舍入类型(大写或小写)。

    如果您希望将您的双精度数截断为 d 小数位(并获得双精度数,而不是整数),您可以使用 round(double a, int d)

    已编辑

    为了舍入而不截断,可以使用这个

    CAST((column * 100) AS int)/100

    【讨论】:

    • 但如果我的值为 35.35623,它会将值四舍五入为 35.36。我不想四舍五入。我希望它被截断(35.35)
    • @AkhilVishwa 所以在这种情况下,您希望结果为35?
    • 没有。我希望结果为 35.35。我需要小数点后的前两个数字,它不应该被四舍五入,而是应该被截断。
    • @AkhilVishwa 试试这个CAST((column * 100) AS int)/100
    • @AkhilVishwa 我很高兴它成功了 :-) 如果你想接受它,我会更新答案。
    【解决方案2】:

    为上述问题编写了一个 UDF,我们可以指定可以截断的字符数

    package com.hive.udf.truncate;
    import java.math.BigDecimal;
    import org.apache.hadoop.hive.ql.exec.UDF;
    public class Trunc extends UDF {
        public double evaluate(double input,int numberOfDecimals){
           if ( input > 0) {
             return new BigDecimal(String.valueOf(input)).setScale(numberOfDecimals, BigDecimal.ROUND_FLOOR).doubleValue();
                } 
           else {
             return new BigDecimal(String.valueOf(input)).setScale(numberOfDecimals, BigDecimal.ROUND_CEILING).doubleValue();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多