Transform,UDF(转)

Map/Reduce 脚本(Transform)

用户可以自定义 Hive 使用的 Map/Reduce 脚本,比如:

  FROM (
	SELECT TRANSFORM(user_id, page_url, unix_time)
	USING 'page_url_to_id.py'
	AS (user_id, page_id, unix_time)
  FROM mylog
	DISTRIBUTE BY user_id
	SORT BY user_id, unix_time)
	  mylog2
	SELECT TRANSFORM(user_id, page_id, unix_time)
	USING 'my_python_session_cutter.py' AS (user_id, session_info);

Map/Reduce 脚本通过 stdin/stdout 进行数据的读写,调试信息输出到 stderr。

UDF(User-Defined-Function)

用户可以自定义函数对数据进行处理,例如:

  add jar build/ql/test/test-udfs.jar;
  CREATE TEMPORARY FUNCTION testlength
	AS 'org.apache.hadoop.hive.ql.udf.UDFTestLength'; 

  SELECT testlength(src.value) FROM src; 

  DROP TEMPORARY FUNCTION testlength;

UDFTestLength.java 为:

  package org.apache.hadoop.hive.ql.udf; 

  public class UDFTestLength extends UDF {
	public Integer evaluate(String s) {
	  if (s == null) {
		return null;
	  }
	return s.length();
	}
  }

自定义函数可以重载:

  add jar build/contrib/hive_contrib.jar;
  CREATE TEMPORARY FUNCTION example_add
	AS 'org.apache.hadoop.hive.contrib.udf.example.UDFExampleAdd'; 

  SELECT example_add(1, 2) FROM src;
  SELECT example_add(1.1, 2.2) FROM src;

UDFExampleAdd.java:

  public class UDFExampleAdd extends UDF {
	public Integer evaluate(Integer a, Integer b) {
	  if (a = null || b = null)
		return null;
	  return a + b;
	} 

	public Double evaluate(Double a, Double b) {
	  if (a = null || b = null)
		return null;
	  return a + b;
	}
  }

%%

在使用 UDF 的时候,会自动进行类型转换,这个 java 或者 C 中的类型转换有些类似,比如:

  SELECT example_add(1, 2.1) FROM src;

的结果是 3.1,这是因为 UDF 将类型为 Int 的参数 “1″ 转换为 double。

类型的隐式转换是通过 UDFResolver 来进行控制的,并且可以根据不同的 UDF 进行不同的控制。

UDF 还可以支持变长的参数,例如 UDFExampleAdd.java:

  public class UDFExampleAdd extends UDF {
	public Integer evaluate(Integer... a) {
	  int total = 0;
	  for (int i=0; i

使用例子为:

  SELECT example_add(1, 2) FROM src;
  SELECT example_add(1, 2, 3) FROM src;
  SELECT example_add(1, 2, 3, 4.1) FROM src;

综上,UDF 具有以下特性:

  • 用 java 写 UDF 很容易。
  • Hadoop 的 Writables/Text 具有较高性能。
  • UDF 可以被重载。
  • Hive 支持隐式类型转换。
  • UDF 支持变长的参数。
  • genericUDF 提供了较好的性能(避免了反射)。
转自:
http://www.javaeye.com/articles/2609
详细UDF详细资料:
http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值