我正在使用hive0.13.1,并使用默认的hivehash函数对键进行哈希组合。类似于从表1中选择散列(date、token1、token2、parameters[“a”]、parameters[“b”]、parameters[“c”]);我跑了150米。对于60%的行,它正确地散列了它。对于其余的行,它给出了0。null或1作为哈希。我查看了导致错误哈希的行,没有发现行有任何问题。是什么导致的?
jvlzgdj91#
仅当提供的所有参数为空或null时,哈希函数才返回0。如果您熟悉java,那么您可以检查hash函数的实现。哈希函数在内部使用 ObjectInspectorUtils.hashCode 要获取所提供字段的哈希代码,请使用以下java代码段手动测试此问题:
ObjectInspectorUtils.hashCode
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>
1条答案
按热度按时间jvlzgdj91#
仅当提供的所有参数为空或null时,哈希函数才返回0。
如果您熟悉java,那么您可以检查hash函数的实现。
哈希函数在内部使用
ObjectInspectorUtils.hashCode
要获取所提供字段的哈希代码,请使用以下java代码段手动测试此问题:运行上述程序所需的maven依赖项: