HIVE内置函数hash() -- 源码解析

本文深入解析了HIVE内置的hash()函数,从initialize方法到evaluate方法,特别是getBucketHashCode和hashCode方法的细节。源码显示,hash()函数支持多种类型参数,通过ObjectInspectorUtils.getBucketHashCode计算哈希值,对于不同类型的数据进行不同的处理。同时警告在Spark中使用此函数可能存在兼容性问题。
摘要由CSDN通过智能技术生成

HIVE内置函数hash() – 源码解析

在hash()值求解中,hive支持多类型,多参数的哈希值求解,那么底层是如何实现的?

首先HIVE提供的hash()内置函数的源码是怎么要求的?

hash内置函数在类中表明:

org.apache.hadoop.hive.ql.udf.generic.GenericUDFHash

一、initialize方法

@Override
  public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentTypeException {
   

    argumentOIs = arguments;
    return PrimitiveObjectInspectorFactory.writableIntObjectInspector;
  }

在初始化参数的时候,并没有做任何的校验,直接返回了一个Int类型,所以在编译阶段是可以随意通过的,无论传入什么参数

二、evaluate方法

private final IntWritable result = new IntWritable();

  @Override
  public Object evaluate(DeferredObject[] arguments) throws HiveException {
   
    Object[] fieldValues = new Object[arguments.length];
    // 将参数取出
    for(int i = 0; i < arguments.length; i++) {
   
      fieldValues[i] = arguments[i].get();
    }
    int r = ObjectInspectorUtils.getBucketHashCode(fieldValues, argumentOIs);
    result.set(r);
    return result;
  }

可以看到在处理阶段是可以传入多个参数的,也就是说hash()这个函数可以传入多个参数,其实最主要的处理方法是调用了ObjectInspectorUtils.getBucketHashCode(fieldValues, argumentOIs);

 int r = ObjectInspectorUtils.getBucketHashCode(fieldValues, argumentOIs);
getBucketHashCode方法

点进去看一下这个方法是什么?

public static int getBucketHashCode(Object[] bucketFields, ObjectInspector[] bucketFieldInspectors) {
   
        int hashCode = 0;
				// 对传入的object,遍历调用hashCode方法
        for(int i = 0; i < bucketFields.length; ++i) {
   
            int fieldHash = hashCode(bucketFields[i], bucketFieldInspectors[i]);
            hashCode = 31 * hashCode + fieldHash;
        }

        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值