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

HIVE MAP排序 GenericUDF

 
阅读更多
package com.duowan.hive.udf.generic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.io.Text;

/**
 * Sort a map
 * the function simple:sort_map(map,'key','desc'),返回map(string,string)
 * @author Irwin
 *
 */
public class GenericUDFSortMap extends GenericUDF {

	private MapObjectInspector mapOI;
	private final Map<Text, Text> sortMap = new LinkedHashMap<Text, Text>();
	
	private ArrayList<Object> keyList = new ArrayList<Object>();
	private ArrayList<Object> valueList = new ArrayList<Object>();
	
	@Override
	public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
		if (arguments.length != 3) {
		      throw new UDFArgumentLengthException("The function SORT_MAP only accepts 3 argument. simple: sort_map(map,'key','desc')");
		    } else if (!(arguments[0] instanceof MapObjectInspector) || !(arguments[1] instanceof ObjectInspector) || !(arguments[2] instanceof ObjectInspector)) {
		      throw new UDFArgumentTypeException(0, "\""
		          + Category.MAP.toString().toLowerCase()
		          + "\" is expected at function SORT_MAP, " + "but \""
		          + arguments[0].getTypeName() + " or " + arguments[1].getTypeName() + " or " +  arguments[2].getTypeName() + "\" is found");
		    }

		    mapOI = (MapObjectInspector) arguments[0];
		    return ObjectInspectorFactory.getStandardMapObjectInspector(
					PrimitiveObjectInspectorFactory.writableStringObjectInspector, 
					PrimitiveObjectInspectorFactory.writableStringObjectInspector);
	}
	
	@Override
	public Object evaluate(DeferredObject[] arguments) throws HiveException {
		sortMap.clear();
		keyList.clear();
		valueList.clear();
		Object mapObj = arguments[0].get();
		String key_valueObj = ((Text)arguments[1].get()).toString();
		String orderObj =  ((Text)arguments[2].get()).toString();
		keyList.addAll(mapOI.getMap(mapObj).keySet());
		valueList.addAll(mapOI.getMap(mapObj).values());
		
		Map<Text,Text> inputMap = new HashMap<Text, Text>();
		//put keys and values
		for (int i = 0; i < keyList.size(); i++) {
			inputMap.put(new Text(keyList.get(i).toString()), new Text(valueList.get(i).toString()));
		}
		if (key_valueObj.equals("key")) {
			sortMap.putAll(sortMayByKey(inputMap, orderObj));
			return sortMap;
		}else {
			sortMap.putAll(sortMapByValue(inputMap, orderObj));
			return sortMap;
		}
	}

	@Override
	public String getDisplayString(String[] children) {
	    return "map(" + children[0] + ")";
	}

	public static Map<Text, Text> sortMapByValue(Map<Text, Text> map, final String order) {
		Map<Text, Text> sortMap = new LinkedHashMap<Text, Text>();
		List<Map.Entry<Text, Text>> list_Data = new ArrayList<Map.Entry<Text, Text>>(map.entrySet());
		// 通过Collections.sort(List I,Comparator c)方法进行排序
		Collections.sort(list_Data,
				new Comparator<Map.Entry<Text, Text>>() {

					@Override
					public int compare(Entry<Text, Text> o1, Entry<Text, Text> o2) {
						if (order.equals("asc")) {
							return o1.toString().compareTo(o2.toString());
						} else {
							return o2.toString().compareTo(o1.toString());
						}
					}
				});
		// put the sorted map
		for (Entry<Text, Text> entry : list_Data) {
			sortMap.put(entry.getKey(), entry.getValue());
		}
		return sortMap;
	}

	public static Map<Text, Text> sortMayByKey(Map<Text, Text> map, final String order) {
		Map<Text, Text> sortMap = new LinkedHashMap<Text, Text>();
	    List<Text> arrayList = new ArrayList<Text>(map.keySet());  
	    Collections.sort(arrayList, new Comparator<Text>() {
			@Override
			public int compare(Text o1, Text o2) {
				if (order.equals("asc")) {
					return o1.toString().compareTo(o2.toString());
				}else {
					return o2.toString().compareTo(o1.toString());
				}
			}
		});
	    //将排序好的key返回
	    for (Text key : arrayList) {
			sortMap.put(key, map.get(key));
		}
		return sortMap;
	}
}

 HIVE 中 MAP排序,根据key或者value,“DESC”或者“ASC”进行Map排序。

 

例子:

SELECT sort_map(map,'key','desc') FROM TABLE;

 

分享到:
评论

相关推荐

    hive性能优化

    Hive中,Map任务的数量由`mapred.min.split.size`和`mapred.max.split.size`这两个参数决定。默认情况下,`mapred.min.split.size`为1B,`mapred.max.split.size`为256MB,这意味着一个Map任务处理的数据量上限为256...

    Hive - A Warehousing Solution Over a Map-Reduce.pdf

    ### Hive:一种基于Map-Reduce的数据仓库解决方案 #### 一、引言 随着大数据时代的到来,数据集的规模正以前所未有的速度增长。这些数据不仅来自传统的商业领域,也涵盖了社交媒体、物联网等多个新兴领域。面对...

    hive参数配置说明大全

    如果设置为true,则Hive将自动将Reduce端的Common Join转化为Map Join,默认值为false。 5. hive.mapred.local.mem 该参数决定了Mapper/Reducer在本地模式的最大内存量,以字节为单位,0为不限制。如果设置为0,则...

    hive客户端安装_hive客户端安装_hive_

    在大数据处理领域,Hive是一个非常重要的工具,它提供了一个基于Hadoop的数据仓库基础设施,用于数据查询、分析和管理大规模数据集。本教程将详细讲解如何在Linux环境下安装Hive客户端,以便进行数据操作和分析。 ...

    Hive优化方法整理

    Hive 优化方法整理是 Hive 数据处理过程中的重要步骤,涉及到 Hive 的类 SQL 语句本身进行调优、参数调优、Hadoop 的 HDFS 参数调优和 Map/Reduce 调优等多个方面。 Hive 类 SQL 语句优化 1. 尽量尽早地过滤数据...

    HIVE安装及详解

    "HIVE安装及详解" HIVE是一种基于Hadoop的数据仓库工具,主要用于处理和分析大规模数据。下面是关于HIVE的安装及详解。 HIVE基本概念 HIVE是什么?HIVE是一种数据仓库工具,主要用于处理和分析大规模数据。它将...

    hive源码分析

    2. **Operator**:处理特定数据流的操作符,如过滤、排序等。 3. **ExprNodeEvaluator**:用于评估表达式的值。 #### 对象模型 Hive使用了丰富的对象模型来表示其内部状态和数据流,这些对象包括但不限于: - **...

    Hive_JDBC.zip_hive java_hive jdbc_hive jdbc pom_java hive_maven连

    在大数据处理领域,Apache Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询存储在Hadoop集群中的大型数据集。Hive JDBC(Java Database Connectivity)是Hive提供的一种...

    SpringBoot整合hive-jdbc示例

    **SpringBoot整合Hive-JDBC详解** 在大数据处理领域,Hadoop生态中的Hive作为一个数据仓库工具,常常用于处理大规模的数据分析任务。而SpringBoot作为Java开发中的微服务框架,以其简洁的配置和快速的开发能力深受...

    Hive_优化——深入浅出学Hive

    1. **全排序**:Hive 的 `SORT BY` 只能在单机范围内排序,而 `ORDER BY` 实现全局排序,需谨慎使用。 2. **笛卡尔积**:在严格模式下,Hive 不允许笛卡尔积,可以通过添加 Join Key 或使用 MapJoin 避免。 3. **...

    Hive SQL 编译过程详解

    - **Distinct的实现原理**:对于单个Distinct字段,Hive会在Map阶段将Group By字段与Distinct字段组合成key,通过Reduce阶段的LastKey机制去重。而对于多个Distinct字段,可以通过两种方法实现:一是使用Hash去重,...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    - 内存参数:如mapreduce.map.memory.mb、hive.server2.executor.memory.overhead等,合理设置可避免内存溢出。 - 执行引擎与优化器:可以选择Tez或Spark作为执行引擎,优化查询计划以提高性能。 - 其他参数:如...

    Hive Summit 2011-join

    在这一讨论中,将详细介绍Hive中的六种join策略,这些策略包括Common Join、Map Join、AutoMap Join、Bucket Map Join、Bucket Sort Merge Map Join和Skew Join。 ***mon Join(普通Join) 普通join是最基本的join...

    hive基本操作

    hive 基本操作的命令和hive 实用命令等,有利与学习hive和mysql

    Ambari下Hive3.0升级到Hive4.0

    在大数据领域,Apache Ambari 是一个用于 Hadoop 集群管理和监控的开源工具,而 Hive 是一个基于 Hadoop 的数据仓库系统,用于处理和分析大规模数据集。本话题聚焦于如何在 Ambari 环境下将 Hive 3.0 升级到 Hive ...

    Hive驱动1.1.0.zip

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop分布式文件系统(HDFS)中的大量结构化数据。Hive 1.1.0是Hive的一个版本,提供了...

    hive参数优化总结

    Map 数和 Reduce 数是 Hive 中两个非常重要的参数,直接影响着 Hive 的性能和效率。 1.1、Map 数 Map 数是 Hive 中一个非常重要的参数,影响着数据处理的速度和效率。Map 数太大将导致 Map 阶段输出文件太小,产生...

    HIVE文件读写

    在IT行业中,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive查询语言)对大规模数据集进行分析和处理。Hive文件读写是Hive核心功能之一,使得数据分析师和数据科学家能够方便地对存储在HDFS...

    Hive3.1.2编译源码

    使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...

Global site tag (gtag.js) - Google Analytics