hive源码分析--row_number源码分析

来源:互联网 发布:林弯弯网店淘宝网址 编辑:程序博客网 时间:2024/06/11 12:40

前言

row_nubmer使用说明: row_number接收到的数据是已经分区排序的数据, row_number() OVER (PARTITION BY ORDER BY d)

description = @Description(    name = "row_number",    value = "_FUNC_() - The ROW_NUMBER function assigns a unique number (sequentially, starting "            + "from 1, as defined by ORDER BY) to each row within the partition."  ),

代码路径

hive版本:2.1.0

row_number对应的源代码类:org.apache.hadoop.hive.ql.udf.generic.GenericUDAFRowNumber

这个是一个UDAF,hive的udf在FunctionRegistry,对应的包在ql目录下

system.registerGenericUDAF("row_number", new GenericUDAFRowNumber());

源码分析

1、临时聚合结果RowNumberBuffer
定义了一个list、计数器,初始化时new一个list、计数器置为1;incr方法 每次将计数器加一并放到list中。
static class RowNumberBuffer implements AggregationBuffer {    ArrayList<IntWritable> rowNums;    int nextRow;    void init() {      rowNums = new ArrayList<IntWritable>();    }    RowNumberBuffer() {      init();      nextRow = 1;    }    void incr() {      rowNums.add(new IntWritable(nextRow++));    }  }

2、iterate方法

           调用RowNumberBuffer.incr(),来一条记录进行加1

public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException {      ((RowNumberBuffer) agg).incr();    }

3、terminate

          返回最终结果,RowNumberBuffer中的list

public Object terminate(AggregationBuffer agg) throws HiveException {      return ((RowNumberBuffer) agg).rowNums;    }



1 0