Hive哈希函数导致0,null和1,为什么?

时间:2016-07-27 15:33:29

标签: mysql hadoop hive hiveql hadoop2

我正在使用hive 0.13.1并使用默认的hive哈希函数散列键的组合。

喜欢的东西       从table1中选择hash(date,token1,token2,parameters [" a"],参数[" b"],参数[" c"]);

我在150M行上运行它。对于60%的行,它正确地进行了哈希处理。对于剩余的行,它给出了0. null或1作为哈希。我查看导致坏哈希的行,我没有看到行有什么问题。可能导致什么呢?

1 个答案:

答案 0 :(得分:0)

只有当所有提供的参数为空或空时,哈希函数才返回0。

如果您熟悉Java,那么您可以检查hash function的实现。

哈希函数在内部使用ObjectInspectorUtils.hashCode来获取所提供字段的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>