hive散列函数导致0、null和1,为什么?

kpbwa7wx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(396)

我正在使用hive0.13.1,并使用默认的hivehash函数对键进行哈希组合。
类似于从表1中选择散列(date、token1、token2、parameters[“a”]、parameters[“b”]、parameters[“c”]);
我跑了150米。对于60%的行,它正确地散列了它。对于其余的行,它给出了0。null或1作为哈希。我查看了导致错误哈希的行,没有发现行有任何问题。是什么导致的?

jvlzgdj9

jvlzgdj91#

仅当提供的所有参数为空或null时,哈希函数才返回0。
如果您熟悉java,那么您可以检查hash函数的实现。
哈希函数在内部使用 ObjectInspectorUtils.hashCode 要获取所提供字段的哈希代码,请使用以下java代码段手动测试此问题:

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.Text;
public class TestHash 
{
    public static void main( String[] args )
    {
        System.out.println( ObjectInspectorUtils.hashCode(null,PrimitiveObjectInspectorFactory.javaStringObjectInspector) );
        System.out.println( ObjectInspectorUtils.hashCode(new Text(""),PrimitiveObjectInspectorFactory.javaStringObjectInspector) );
    }
}

运行上述程序所需的maven依赖项:

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.2</version>
        </dependency>

相关问题