读书人

Hive 的扩张特性

发布时间: 2012-12-26 14:39:29 作者: rapoo

Hive 的扩展特性

用户如果想为 Binary 数据增加自定义的 SerDE,可以参考例子:serde/src/java/org/apache/hadoop/hive/serde2/binarysortable,例如:

  CREATE TABLE mythrift_table  ROW FORMAT SERDE    'org.apache.hadoop.hive.contrib.serde2.thrift.ThriftSerDe'  WITH SERDEPROPERTIES (    "serialization.class" = "com.facebook.serde.tprofiles.full",    "serialization.format" = "com.facebook.thrift.protocol.TBinaryProtocol";);

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 mylogDISTRIBUTE BY user_idSORT BY user_id, unix_time)  mylog2SELECT 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 testlengthAS '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_addAS '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<a.length; i++)if (a[i] != null) total += a[i];   return total;  } // the same for Double public Double evaluate(Double... a) }

使用例子为:

  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 具有以下特性:

读书人网 >编程

热点推荐