记一次写hive-udf历程

package com.gome.dw.udf;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

import java.util.Map;


/**
 * 获取指定json的第n个值
 */
@Description(name = "GetJsonNValue",           //方法名
        value = "_FUNC_(data_str,num_int)",   //参数类型
        extended = "Example:\n"   //调用示例
                + "select GetJsonNValue('{\"ACCOUNT_MANAGE_FEE\":{\"amount\":62,\"feeCode\":\"ACCOUNT_MANAGE_FEE\"}}',1);\n"
                + "{\"amount\":62,\"feeCode\":\"ACCOUNT_MANAGE_FEE\"}")   //返回结果示例
public class GetJsonNValue extends UDF {


    public String evaluate(String data, int num) {
        try {
            Map f = (Map)JSON.parse(data);
            int n=1;
            for (Object item:f.keySet()){
                if(n==num){
                    JSONObject f2=(JSONObject)f.get(item);
                    return f2.toJSONString();
                }
                n++;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

//idea测试
    public static void main(String[] args) {
        String evaluate = new GetJsonNValue().evaluate("{\"ACCOUNT_MANAGE_FEE\": {\"amount\": 62, \"feeCode\": \"ACCOUNT_MANAGE_FEE\"}}",1);
        //GetJsonNValue evaluate = new GetJsonNValue();

        System.out.println(evaluate);
    }

}


pom.xml
之前一直使用的exlipse,天知道idea对新手有这么大的恶意。。。
一、写完之后,在idea测试没有问题,把jar包放到测试环境里,调用hive-udf却一直报参数类型错误,无论怎么改参数类型,怎么给参数类型都会报错
原因:使用了import com.alibaba.fastjson.JSON;这个包,测试环境里没有,需要maven打包的时候带着依赖,xxxwith-dependencies这种包,在依赖里使用maven-assembly这个插件就可以
二、在依赖里使用maven-assembly这个插件,发现竟然只能打出jar包,不能打出with-dependencies带依赖的包,maven本地仓库错误,插件未起作用,(真是神奇,idea全程不报错的),然后清空重新设置本地仓库,mvn help:system命令
三、在项目里移除了modul(物理项目后),发现重新导入项目却一直是空目录,原因是原来的maven项目只是移除了模块而已,maven ID还是存在的,所以只要你重新导入文件mavenID不变,idea始终还是认为原来的,因为是公共的项目,不能改maven ID,然后想着删除idea里的逻辑项目,各种办法删除,然后重新导入还是空目录。。。
感觉是删不掉了,添加模块进去
四、先是右边的depencies下有红线,网上各种办法不管用(什么clean的),
简单粗暴的方法,谁报错,就在本地仓库删掉谁,重新下载就好了
然后打开类,类又报错,具体咋解决的我竟然忘了,太多了,(invalidated caches/restart常用吧),感觉idea在强大的同时,有事就发现做一个简单的事情变的那么复杂,(在exlipse里删除项目两部的事情在这快给我搞崩溃了,不知道我咋坚持的)
五、打包报错,xxxjar already added, skipping ,然后又各种查,最后发现maven-assembly-plugin这个插件自身的bug造成的,天啊,maven咋也这样呢,感谢这位大哥(不然去找自己的错不知道又要走多少弯路),具体网https://blog.csdn.net/u011069096/article/details/51275649 ,然后换下2.4或更高版本的maven-assembly-plugin插件就好了
打包成功
特附插件使用方法:


  ...
  
    
    
      
        
          org.apache.maven.plugins
          maven-assembly-plugin
          3.1.1
        
        ...
      
    
    
    
      
        org.apache.maven.plugins
        maven-assembly-plugin
        3.1.1
      
      ...
    
  
  ...

六、打包成功后,添加jar包进hive环境,创建临时函数的时候却报错找不到类,(具体原因应该是本来项目指定了一个maven-assembly-plugin插件版本,然后我又显示指定了一次插件版本,然后加载jar包的时候就不知道加载谁了,索性不加载了。。。。),所以修改插件版本的方向是错误的,然后用2.2的版本又报错java.lang.StackOverflowError,报栈溢出的错误,具体更改maven的栈和idea的栈,改完就好了,具体解决过程https://truth99.iteye.com/blog/2306999

你可能感兴趣的:(hive学习)