• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Loneliness Ends HUHU
热情坦诚
博客园    首页    新随笔    联系   管理    订阅  订阅
hive -- 自定义函数和Transform

                                hive -- 自定义函数和Transform


    UDF操作单行数据,

    UDAF:聚合函数,接受多行数据,并产生一个输出数据行

    UDTF:操作单个数据

使用udf方法:

第一种:

    add jar xxx.jar

    cteate temporary function 方法名;

    注销一个jar方法:drop temporay function 方法名;

第二种:写一个脚本

    vi cat hive_init

    add jar /home/data/xxx.jar

    create temporary fucntion 方法名 as '类的全限定名'

    hive -i hive_init

第三种:

    自定义UDF注册为hive的内置函数

自定义函数:(UDF)

   数据:

    

package UDF;

import java.util.HashMap;

import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * 
 * @author huhu_k
 *
 */
public class ToLowerCase extends UDF {

	public static HashMap<String, String> provinceMap = new HashMap<>();

	static {
		provinceMap.put("136", "beijing");
		provinceMap.put("137", "shanghai");
		provinceMap.put("138", "shenzhen");
	}

	// 必须是public
	public String evaluate(String field) {
		String lowerCase = field.toLowerCase();
		return lowerCase;
	}

	// 必须是public
	public String evaluate(int field) {
		String pn = String.valueOf(field);
		return provinceMap.get(pn.substring(0, 3)) == null ? "huoxing" : provinceMap.get(pn.substring(0, 3));
	}

}

1.将name大写变为小写:



2.数据:



通过手机号获取手机地址:



当你在一个类中再次写了方法时,再次导入jar时,要先推出hive,然后在进入hive,然后进行add JAR XXXXX;


3.数据:


使用json数据

package UDF;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.codehaus.jackson.map.ObjectMapper;

public class JsonParser extends UDF {

	public String evaluate(String json) {
		ObjectMapper objectMapper = new ObjectMapper();
		try {
			Moive readValue = objectMapper.readValue(json, Moive.class);
			return readValue.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}
package UDF;

public class Moive {

	private String movie;
	private String rate;
	private String timeStamp;
	private String uid;
	public String getMovie() {
		return movie;
	}
	public void setMovie(String movie) {
		this.movie = movie;
	}
	public String getRate() {
		return rate;
	}
	public void setRate(String rate) {
		this.rate = rate;
	}
	public String getTimeStamp() {
		return timeStamp;
	}
	public void setTimeStamp(String timeStamp) {
		this.timeStamp = timeStamp;
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	@Override
	public String toString() {
		return  movie + "\t" + rate + "\t" + timeStamp + "\t" + uid;
	}
	
	
}



然后将查询出来的数据插入到一张表中


1.使用hive中的自带函数可以解析简单的json数据格式

 create table t_json2 as select get_json_object(line,'$.movie')as movie,get_json_object(line,'$.rate')as rate,get_json_object(line,'$.timeStamp')as timeStamps,get_json_object(line,'$.uid')as uid from  t_json;




2.使用自定义函数

create table t_json1 as select split(toJson(line),'\t')[0]as movieid,split(toJson(line),'\t')[1]as,split(toJson(line),'\t')[2]as timestring,split(toJson(line),'\t')[3]as uid from t_json;


ok!!!


Transform:

Hive的Transform关键字提供了在SQL中调用自写脚本的功能

例子:



先编辑一个python脚本文件

#!/bin/python
import sys
import datetime

for line in sys.stdin:
  line = line.strip()
  movieid, rating, unixtime,userid = line.split('\t')
  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
  print '\t'.join([movieid, rating, str(weekday),userid])

将文件加入hive的路径classpath

add file /home/data/weekday_mapper.py;

创建一个表:

create table t_json_day as select transform (movieid,rate,timestring,uid) using 'python weekday_mapper.py' as (movieid,rate,weekday,uid) from t_json1;

posted on 2018-07-10 17:53  meiLinYa  阅读(288)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3