Hive serde 序列化表例子

文章转载自 : http://blog.csdn.net/mango_song/article/details/12562137


1. 概述

一个文本f1.txt的格式如下:

  1. 1  tom  
  2.   
  3. 2        jame  
  4.   
  5. 3             mango  

它的第一列是id,第二列是name,第一列和第二列间通过不固定长度的空白(如空格 制表符等)分割;

我们希望创建一个user表,能够识别f1.txt ,通过创建表时执行分隔符的方法就不行了,这就需要用到Hive的序列化(SerDe)了。


2. 新建一个maven项目,添加hive-serde 0.11.0 , Hadoop-core 1.0.3的依赖。

创建SerdeTest类,实现Deserializer接口,

  • 在initialize()方法中,描述表的各个字段及其类型
  • 在deserialize(Writable text)方法中将text解析成id和name
  • getObjectInspector()方法返回ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames,structFieldObjectInspectors)


  1. package com.renren.hive.tools;  
  2.   
  3.   
  4. public class SerdeTest implements Deserializer {  
  5.     private List<String> structFieldNames = new ArrayList<String>();  
  6.     private List<ObjectInspector> structFieldObjectInspectors = new ArrayList<ObjectInspector>();  
  7.   
  8.     @Override  
  9.     public ObjectInspector getObjectInspector() throws SerDeException {  
  10.         // TODO Auto-generated method stub  
  11.   
  12.         return ObjectInspectorFactory.getStandardStructObjectInspector(  
  13.                 structFieldNames, structFieldObjectInspectors);  
  14.     }  
  15.   
  16.     @Override  
  17.     public Object deserialize(Writable text) throws SerDeException {  
  18.         // TODO Auto-generated method stub  
  19.   
  20.         List<Object> result = new ArrayList<Object>();  
  21.         StringTokenizer tokenizer = new StringTokenizer(text.toString());  
  22.         int index = 0;  
  23.   
  24.         while (tokenizer.hasMoreTokens()) {  
  25.             if (index == 0) {  
  26.                 result.add(Integer.valueOf(tokenizer.nextToken()).intValue());  
  27.             } else {  
  28.                 result.add(tokenizer.nextToken());  
  29.             }  
  30.             index++;  
  31.         }  
  32.   
  33.         return result;  
  34.     }  
  35.   
  36.     @Override  
  37.     public void initialize(Configuration arg0, Properties arg1)  
  38.             throws SerDeException {  
  39.         // TODO Auto-generated method stub  
  40.         structFieldNames.add("id");  
  41.         structFieldObjectInspectors.add(ObjectInspectorFactory  
  42.                 .getReflectionObjectInspector(Integer.TYPE,  
  43.                         ObjectInspectorOptions.JAVA));  
  44.         structFieldNames.add("name");  
  45.         structFieldObjectInspectors.add(ObjectInspectorFactory  
  46.                 .getReflectionObjectInspector(String.class,  
  47.                         ObjectInspectorOptions.JAVA));  
  48.     }  
  49.   
  50.     @Override  
  51.     public SerDeStats getSerDeStats() {  
  52.         // TODO Auto-generated method stub  
  53.         return null;  
  54.     }  
  55.   
  56. }  
3.  生成jar包添加到hive/lib下:

   

  1. mvn clean package   

   将生成的jar包:hive-serde-tool-1.0.1-SNAPSHOT.jar 添加到hive_home/lib下,并在hive-site.xml中添加:

  1. <property>  
  2.   <name>hive.aux.jars.path</name>  
  3.   <value>file:///home/dp/hive/lib/hive-serde-tool-1.0.1-SNAPSHOT.jar</value>  
  4. </property>  
4. 创建hive表,指定serde

  

  1. hive -e "create table test row formated serde 'com.renren.hive.tools.SerdeTest'"  

5.加载并查询数据

 

  1. hive -e "load data  local inpath 'f1.txt' overwrite into table test"  
  2.   
  3.  hive -e "select * from test"  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值