用户可以自定义 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。
用户可以自定义函数对数据进行处理,例如:
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 具有以下特性:
http://www.javaeye.com/articles/2609
详细UDF详细资料:
http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF