hive源码分析--row

    xiaoxiao2024-12-26  12

    前言

    row_nubmer使用说明: row_number接收到的数据是已经分区排序的数据, row_number() OVER (PARTITION BY c 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; }

    转载请注明原文地址: https://ju.6miu.com/read-1295015.html
    最新回复(0)