• HIVE内置函数map_keys -- 源码解析


    HIVE内置函数map_keys


    所在的全类名

    org.apache.hadoop.hive.ql.udf.generic.GenericUDFMapKeys
    
    • 1

    一、initialize方法

    @Override
      public ObjectInspector initialize(ObjectInspector[] arguments)
      throws UDFArgumentException {
        // 传入的参数为1个
        if (arguments.length != 1) {
          throw new UDFArgumentLengthException("The function MAP_KEYS only accepts one argument.");
        } else if (!(arguments[0] instanceof MapObjectInspector)) {
          // 参数类型应该是MAP类型
          throw new UDFArgumentTypeException(0, "\""
              + Category.MAP.toString().toLowerCase()
              + "\" is expected at function MAP_KEYS, " + "but \""
              + arguments[0].getTypeName() + "\" is found");
        }
    		// 参数强转为MapObjectInspector
        mapOI = (MapObjectInspector) arguments[0];
        // 返回一个map的key检查器
        ObjectInspector mapKeyOI = mapOI.getMapKeyObjectInspector();
        // 返回一个列表
        return ObjectInspectorFactory.getStandardListObjectInspector(mapKeyOI);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在上面的源码之后,需要知道返回的列表是怎么执行的,点进去ObjectInspectorFactory类看getStandardListObjectInspector方法

    public static StandardListObjectInspector getStandardListObjectInspector(ObjectInspector listElementObjectInspector) {
        StandardListObjectInspector result = (StandardListObjectInspector)cachedStandardListObjectInspector.get(listElementObjectInspector);
        if (result == null) {
            result = new StandardListObjectInspector(listElementObjectInspector);
            StandardListObjectInspector prev = (StandardListObjectInspector)cachedStandardListObjectInspector.putIfAbsent(listElementObjectInspector, result);
            if (prev != null) {
                result = prev;
            }
        }
    
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其中cachedStandardListObjectInspector的声明如下

    static ConcurrentHashMap<ObjectInspector, StandardListObjectInspector> cachedStandardListObjectInspector = new ConcurrentHashMap();
    
    • 1

    二、evaluate方法

    @Override
      public Object evaluate(DeferredObject[] arguments) throws HiveException {
        retArray.clear();
        Object mapObj = arguments[0].get();
        Map<?,?> mapVal = mapOI.getMap(mapObj);
        if (mapVal != null) {
          retArray.addAll(mapVal.keySet());
        }
        return retArray;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    getDisplayString方法

    @Override
      public String getDisplayString(String[] children) {
        assert children.length == 1;
        return getStandardDisplayString("map_keys", children);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    getStandardDisplayString的方法:

    protected String getStandardDisplayString(String name, String[] children) {
        return getStandardDisplayString(name, children, ", ");
      }
    
    • 1
    • 2
    • 3

    调用了重载方法,一点点的把数组内的数据append到字符中

    protected String getStandardDisplayString(String name, String[] children, String delim) {
      StringBuilder sb = new StringBuilder();
      sb.append(name);
      sb.append("(");
      if (children.length > 0) {
        sb.append(children[0]);
        for (int i = 1; i < children.length; i++) {
          sb.append(delim);
          sb.append(children[i]);
        }
      }
      sb.append(")");
      return sb.toString();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    eNSP在hybrid接口上配置vlan
    应用程序会不会导致linux系统崩溃死机?
    Python中如何使用ThreadPoolExecutor一次开启多个线程
    【5G MAC】Msg1 TX开环功控介绍
    【无标题】弘辽科技:怎么提高淘宝店铺访客量和流量?做好哪些方面?
    LeetCode【240】搜索二维矩阵
    L40.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- useradd和usermod
    InnoDB存储引擎存储结构详解-实战篇
    瑞芯微rk1126 编译mp4v2记录 rk1126移植 ffmpeg
    spring事务失效的12种场景,一步一个坑
  • 原文地址:https://blog.csdn.net/weixin_46429290/article/details/125610603