设为首页 收藏本站
查看: 1845|回复: 0

[经验分享] Hive 随谈(六)– Hive 的扩展特性

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-6-6 10:27:01 | 显示全部楼层 |阅读模式
Hive 是一个很开放的系统,很多内容都支持用户定制,包括:
  • 文件格式:Text File,Sequence File
  • 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text
  • 用户提供的 map/reduce 脚本:不管什么语言,利用 stdin/stdout 传输数据
  • 用户自定义函数: Substr, Trim, 1 – 1
  • 用户自定义聚合函数: Sum, Average…… n – 1
File Format

TextFileSequenceFIleRCFFile
Data typeText OnlyText/BinaryText/Binary
Internal Storage OrderRow-basedRow-basedColumn-based
CompressionFile BasedBlock BasedBlock Based
SplitableYESYESYES
Splitable After CompressionNoYESYES
  CREATE TABLE mylog ( user_id BIGINT, page_url STRING, unix_time INT)  STORED AS TEXTFILE;当用户的数据文件格式不能被当前 Hive 所识别的时候,可以自定义文件格式。可以参考 contrib/src/java/org/apache/hadoop/hive/contrib/fileformat/base64 中的例子。写完自定义的格式后,在创建表的时候指定相应的文件格式就可以:
  CREATE TABLE base64_test(col1 STRING, col2 STRING)    STORED AS    INPUTFORMAT 'org.apache.hadoop.hive.contrib.      fileformat.base64.Base64TextInputFormat'    OUTPUTFORMAT 'org.apache.hadoop.hive.contrib.      fileformat.base64.Base64TextOutputFormat';SerDeSerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。序列化的格式包括:
  • 分隔符(tab、逗号、CTRL-A)
  • Thrift 协议
反序列化(内存内):
  • Java Integer/String/ArrayList/HashMap
  • Hadoop Writable 类
  • 用户自定义类
目前存在的 Serde 见下图:
其中,LazyObject 只有在访问到列的时候才进行反序列化。 BinarySortable:保留了排序的二进制格式。
当存在以下情况时,可以考虑增加新的 SerDe:
  • 用户的数据有特殊的序列化格式,当前的 Hive 不支持,而用户又不想在将数据加载至 Hive 前转换数据格式。
  • 用户有更有效的序列化磁盘数据的方法。
用户如果想为 Text 数据增加自定义 Serde ,可以参照 contrib/src/java/org/apache/hadoop/hive/contrib/serde2/RegexSerDe.java 中的例子。RegexSerDe 利用用户提供的正则表倒是来反序列化数据,例如:
  CREATE TABLE apache_log(    host STRING,    identity STRING,    user STRING,    time STRING,    request STRING,    status STRING,    size STRING,    referer STRING,    agent STRING)  ROW FORMAT    SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'    WITH SERDEPROPERTIES      ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\[[^\]]*\])      ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\")      ([^ \"]*|\"[^\"]*\"))?",      "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s";)      STORED AS TEXTFILE;用户如果想为 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 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<a.length; i++)="" if="" (a="" !="null)" total="" +="a;" return="" total;="" }="" the="" same="" for="" double="" public="" 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 具有以下特性:
  • 用 java 写 UDF 很容易。
  • Hadoop 的 Writables/Text 具有较高性能。
  • UDF 可以被重载。
  • Hive 支持隐式类型转换。
  • UDF 支持变长的参数。
  • genericUDF 提供了较好的性能(避免了反射)。
UDAF(User-Defined Aggregation Funcation)例子:
  SELECT page_url, count(1), count(DISTINCT user_id) FROM mylog;UDAFCount.java:
  public class UDAFCount extends UDAF {        public static class Evaluator implements UDAFEvaluator {          private int mCount;           public void init() {                mcount = 0;          }           public boolean iterate(Object o) {                if (o!=null)                  mCount++;                 return true;          }           public Integer terminatePartial() {                return mCount;          }           public boolean merge(Integer o) {                mCount += o;                return true;          }           public Integer terminate() {                return mCount;          }  }UDAF 总结:
  • 编写 UDAF 和 UDF 类似
  • UDAF 可以重载
  • UDAF 可以返回复杂类
  • 在使用 UDAF 的时候可以禁止部分聚合功能
UDF,UDAF 和 MR 脚本的对比:


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-20253-1-1.html 上篇帖子: Hive 随谈(五)– Hive 优化 下篇帖子: 写好Hive 程序的五个提示
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表