2、利用row_number去重
由于的hive.0.11.0版本加入了对row_number()的内建函数的支持,但是0.8.0仍然不支持,因此通过编写UDF内建函数来完成,具体如下:
(1)下载hive-exec-1.0.1.jar;
(2)编写row_number的用户自定义的UDF;
package com.blue.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class RowNumber extends UDF {
private static int MAX_VALUE = 50;
private static String comparedColumn[] = new String[MAX_VALUE];
private static int rowNum = 1;
public int evaluate(Object... args)
{
String columnValue[] = new String[args.length];
for (int i = 0; i < args.length; i++)
columnValue[i] = args[i].toString();
if (rowNum == 1)
{
for (int i = 0; i < columnValue.length; i++)
comparedColumn[i] = columnValue[i];
}
for (int i = 0; i < columnValue.length; i++)
{
if (!comparedColumn[i].equals(columnValue[i]))
{
for (int j = 0; j < columnValue.length; j++)
{
comparedColumn[j] = columnValue[j];
}
rowNum = 1;
return rowNum++;
}
}
return rowNum++;
}
}
该类继承自hive的UDF类,该类是按若干列的值进行分组,在相同组内对记录进行编号。每扫描一行记录,该类的evaluate方法就会被执行,evaluate方法的内部逻辑是:comparedColumn数组用于跟踪上一条记录的分组列的值,碰到上一条记录在若干列上的值与当前记录的若干列的值相同,便将rowNumber++,一旦碰到值不同的
便将当前记录的若干列的值赋给comparedColumn数组,作为新的编号起点,依次下去,直到扫描完所有记录为止。
(3)将该类生成jar文件,打jar包时,不用将hive-exec-1.0.1.jar一块儿打入,rz -be 上传该jar文件到某一路径下;
(4)内建函数的使用方法,如下:
add jar /home/work/zcc/data_checksame/blueudf.jar;
create temporary function row_number as 'com.blue.hive.udf.RowNumber';
) t where t.rn=1;
总结:(1)hive如何获取非group by字段;
(2)hive表的查重策略;
(3)hive表的UDF使用方法;
(4) Execution Error, return code [-101] (unknow error) from org.apache.hadoop.hive.ql.exec.FunctionTask异常解决方法,务必保证UDF的编译jdk版本与运行hive的jdk版本保持一致。
后续提供hive表的不同查重方法的优化性能。