我正在使用hive 0.13.1并使用默认的hive哈希函数散列键的组合。
喜欢的东西 从table1中选择hash(date,token1,token2,parameters [" a"],参数[" b"],参数[" c"]);
我在150M行上运行它。对于60%的行,它正确地进行了哈希处理。对于剩余的行,它给出了0. null或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>