`
yugouai
  • 浏览: 498520 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

记录中的最大行max_row

 
阅读更多
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
import org.apache.hadoop.hive.ql.udf.UDFType;
import org.apache.hadoop.hive.serde2.lazybinary.LazyBinaryStruct;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;

@Description(name = "maxrow", value = "_FUNC_(expr) - Returns the maximum value of expr and values of associated columns as a struct")
public class GenericUDAFMaxRow extends AbstractGenericUDAFResolver {

  static final Log LOG = LogFactory.getLog(GenericUDAFMaxRow.class.getName());

  @Override
  public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws SemanticException {
    // Verify that the first parameter supports comparisons.
    ObjectInspector oi = TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(parameters[0]);
    if (!ObjectInspectorUtils.compareSupported(oi)) {
      throw new UDFArgumentTypeException(0, "Cannot support comparison of map<> type or complex type containing map<>.");
    }
    return new GenericUDAFMaxRowEvaluator();
  }

  // @UDFType(distinctLike=true)
  public static class GenericUDAFMaxRowEvaluator extends GenericUDAFEvaluator {

    ObjectInspector[] inputOIs;
    ObjectInspector[] outputOIs;
    ObjectInspector structOI;

    @Override
    public ObjectInspector init(Mode mode, ObjectInspector[] parameters) throws HiveException {
      super.init(mode, parameters);

      int length = parameters.length;
      if (length > 1 || !(parameters[0] instanceof StructObjectInspector)) {
        assert(mode == Mode.COMPLETE || mode == Mode.FINAL);
        initMapSide(parameters);

      } else {
        assert(mode == Mode.PARTIAL1 || mode == Mode.PARTIAL2);
        assert(parameters.length == 1 && parameters[0] instanceof StructObjectInspector);
        initReduceSide((StructObjectInspector) parameters[0]);
      }

      return structOI;
    }

    /* Initialize the UDAF on the map side. */
    private void initMapSide(ObjectInspector[] parameters) throws HiveException {
      int length = parameters.length;
      outputOIs = new ObjectInspector[length];
      List<String> fieldNames = new ArrayList<String>(length);
      List<ObjectInspector> fieldOIs = Arrays.asList(outputOIs);

      for (int i = 0; i < length; i++) {
        fieldNames.add("col" + i); // field names are not made available! :(
        outputOIs[i] = ObjectInspectorUtils.getStandardObjectInspector(parameters[i]);
      }

      inputOIs = parameters;
      structOI = ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }

    /* Initialize the UDAF on the reduce side (or the map side in some cases). */
    private void initReduceSide(StructObjectInspector inputStructOI) throws HiveException {
      List<? extends StructField> fields = inputStructOI.getAllStructFieldRefs();
      int length = fields.size();
      inputOIs = new ObjectInspector[length];
      outputOIs = new ObjectInspector[length];
      for (int i = 0; i < length; i++) {
        StructField field = fields.get(i);
        inputOIs[i] = field.getFieldObjectInspector();
        outputOIs[i] = ObjectInspectorUtils.getStandardObjectInspector(inputOIs[i]);
      }
      structOI = ObjectInspectorUtils.getStandardObjectInspector(inputStructOI);
    }

    static class MaxAgg implements AggregationBuffer {
      Object[] objects;
    }

    @Override
    public AggregationBuffer getNewAggregationBuffer() throws HiveException {
      MaxAgg result = new MaxAgg();
      return result;
    }

    @Override
    public void reset(AggregationBuffer agg) throws HiveException {
      MaxAgg maxagg = (MaxAgg) agg;
      maxagg.objects = null;
    }

    @Override
    public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException {
      merge(agg, parameters);
    }

    @Override
    public Object terminatePartial(AggregationBuffer agg) throws HiveException {
      return terminate(agg);
    }

    @Override
    public void merge(AggregationBuffer agg, Object partial) throws HiveException {
      if (partial != null) {
        MaxAgg maxagg = (MaxAgg) agg;
        List<Object> objects;
        if (partial instanceof Object[]) {
          objects = Arrays.asList((Object[]) partial);
        } else if (partial instanceof LazyBinaryStruct) {
          objects = ((LazyBinaryStruct) partial).getFieldsAsList();
        } else {
          throw new HiveException("Invalid type: " + partial.getClass().getName());
        }

        boolean isMax = false;
        if (maxagg.objects == null) {
          isMax = true;
        } else {
          int cmp = ObjectInspectorUtils.compare(maxagg.objects[0], outputOIs[0], objects.get(0), inputOIs[0]);
          if (cmp < 0) {
            isMax = true;
          }
        }

        if (isMax) {
          int length = objects.size();
          maxagg.objects = new Object[length];
          for (int i = 0; i < length; i++) {
            maxagg.objects[i] = ObjectInspectorUtils.copyToStandardObject(objects.get(i), inputOIs[i]);
          }
        }
      }
    }

    @Override
    public Object terminate(AggregationBuffer agg) throws HiveException {
      MaxAgg maxagg = (MaxAgg) agg;
      return Arrays.asList(maxagg.objects);
    }
  }
}

 maxrow(compare_col,col1,col2,col3....)根据输入的compare列进行比较,返回最大行,包含值compare-col,col1,col2...返回结构是struct,需要根据struct结构取值

分享到:
评论

相关推荐

    在C语言中算法实现寻找马鞍点算法

    在C语言中,马鞍点算法是一种用于处理二维数组的问题,它的主要目标是找到数组中的一个元素,这个元素既是所在行上的最小值,也是所在列上的最大值。马鞍点在矩阵中通常代表着一个特殊的转折点,对于数据分析或特定...

    积水问题 一维及二维解法

    2. **双指针法**:从数组的两端同时开始遍历,左边的指针记录当前位置的最大高度(Left_Max),右边的指针记录右边界的最大高度(Right_Max)。在遍历过程中,比较两者高度并更新积水体积,直到两个指针相遇。这种...

    VB 寻找鞍点

    1. 初始化变量:创建两个变量,一个用于存储当前最大值(max_value),另一个用于记录最大值的索引(max_index)。 2. 遍历矩阵的每一行:使用for循环遍历矩阵的行,对于每一行,再次使用嵌套的for循环遍历列。 3....

    并发的事务中保证数据表数据完整性的一些思考.docx

    在单个进程中,这可以通过查询最大值(`max(row_id)`)并进行插入操作来实现。但在多并发场景下,当多个进程同时执行此操作时,可能导致多个进程获取到相同的最大值,从而插入重复的序列号。 为了解决这个问题,一...

    MySQL – binlog日志简介及设置

    ROW模式只记录哪些行被修改及其修改后的状态,避免了STATEMENT模式的某些问题。优点是能精确复制所有操作,包括存储过程、函数和触发器。但缺点是可能会生成大量日志,尤其是在执行ALTER TABLE等操作时,日志文件...

    C语言求鞍点

    - 对于每一行,我们首先将当前行的第一个元素设为行最大值row_max。 - 内层循环中,比较当前元素与row_max,如果当前元素更大,则更新row_max。 4. **检查鞍点**:在内层循环结束后,我们将row_max与同一列的...

    《C++程序设计实践教程》(任志鸿版)第12章实验结果.docx

    接下来,通过双层循环遍历数组,每次比较当前元素与已知的最大值`maxvalue`,如果当前元素更大,则更新最大值,并记录其所在的位置(行号`max_row`和列号`max_col`)。最后,程序会输出最大元素的值以及它的行列位置...

    OracleSQL实例-删除重复数据行留最新日期实例.pdf

    这个`DELETE`语句会删除所有不包含在子查询结果中的行,子查询返回每个`name`的最大`tran_date`,即最新的记录。这样,表`abc`将只保留每个`name`的最新`tran_date`的记录,其他重复的旧记录都将被删除。 请注意,...

    C语言 c++语言 二维数组找鞍点

    if (row_max == col_min && row_of_col_min != -1) { printf("鞍点是 (%d, %d): %d\n", row_of_col_min, i, col_min); break; } } if (row_of_col_min == -1) { printf("没有鞍点。\n"); } return 0; } `...

    oracle删除重复记录性能分析

    另一种常见方法是使用ROW_NUMBER()函数结合子查询来删除重复记录。具体SQL语句如下: ```sql DELETE FROM demo WHERE rowid IN (SELECT rid FROM (SELECT rowid rid, ROW_NUMBER() OVER (PARTITION BY object_id ...

    关系型数据库+Mysql+查询用户连续登陆天数+数据统计

    我们使用 case 语句来判断每一行记录是否是连续的,如果是连续的,则将 @row_number 加 1,否则将 @row_number 重置为 1。 这个例子展示了如何使用 MySQL 的 row_number 函数来实现查询用户连续登录天数。这个技术...

    sql高级语句.txt

    - **-r row_term**: 记录终止符,默认为`\n`。 - **-i input_file**: 输入文件路径。 - **-o output_file**: 输出文件路径。 - **-a packet_size**: 数据包大小。 - **-S server_name[\instance_name]**: 指定服务器...

    编写程序,找出一个二维数组的鞍点,即在当前行最大,当前列最小的元素,也可能没有鞍点。

    row_maxes[i] = max(row_maxes[i], matrix[i][j]) col_mins[j] = min(col_mins[j], matrix[i][j]) saddle_points = [] for i in range(len(matrix)): for j in range(len(matrix[i])): if row_maxes[i] == ...

    oracle、mysql数据库分页借鉴.pdf

    这里`max_page_size`和`min_page_size`分别代表每页的最大记录数和当前页起始位置的记录数。 2. SQL Server数据库分页: SQL Server提供了TOP关键字用于分页,同时结合NOT IN或ID大于某个值的条件来实现。示例如下...

    code_算法python_

    这可以通过一次遍历矩阵并维护行最小值和列最大值的记录来实现,也可以利用Numpy的高级特性,如argmin和argmax函数,结合广播机制来高效解决。 例如,在Numpy中,我们可以先找到每行的最小值和全矩阵的最大值,然后...

    oracle 中的经典SQL

    - `AVG_ROW_LEN`: 每行的平均长度。 - `SAMPLE_SIZE`: 采样大小。 - `LAST_ANALYZED`: 上次分析的时间。 #### 十二、查看还没提交的事务 此查询列出了所有未提交的事务。 **SQL语句**: ```sql SELECT * FROM V$...

    sql_按照某一个字段进行去重后获取全部字段

    - **窗口函数**:如 ROW_NUMBER(), RANK() 和 DENSE_RANK() 等,这些函数可以帮助我们在查询结果中确定每行的唯一性,并且可以与其他 SQL 语句结合使用以达到更复杂的需求。 ### 按照某一字段进行去重并获取所有...

    Oracle DBA Tables

    34. **BUFFER_ROW_MOVES**:缓冲行移动计数。 35. **GLOBAL_STATS**:全局统计信息状态。 36. **DURATION**:持续时间。 37. **SKIP_CORRUPT**:跳过损坏的数据块。 38. **MONITORING**:监控设置。 39. **CLUSTER_...

Global site tag (gtag.js) - Google Analytics