`
yugouai
  • 浏览: 494822 次
  • 性别: 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 的类 SQL 语句本身进行调优、参数调优、Hadoop 的 HDFS 参数调优和 Map/Reduce 调优等多个方面。 Hive 类 SQL 语句优化 1. 尽量尽早地过滤数据...

    HIVE安装及详解

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

    hive源码分析

    2. **Operator**:处理特定数据流的操作符,如过滤、排序等。 3. **ExprNodeEvaluator**:用于评估表达式的值。 #### 对象模型 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数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

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

    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提供的一种...

    hive基本操作

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

    Hive驱动1.1.0.zip

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

    Ambari下Hive3.0升级到Hive4.0

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

    hive参数优化总结

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

    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。 所以,如果想要使用高...

    HIVE文件读写

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

    Hive教程.pdf

    - **Map Shuffle过程**: 在Map任务结束时,数据会被分区、排序,并写入磁盘。 - **Reduce Shuffle过程**: 数据从Map任务传输到Reduce任务,并再次排序。 - **性能瓶颈和优化**: - **HiveQL层面优化**: - 利用...

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

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

Global site tag (gtag.js) - Google Analytics