Hive serde 序列化表例子

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


1. 概述

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

[plain] view plain copy
print ?
  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)


[java] view plain copy
print ?
  1. package com.renren.hive.tools;  
  2.   
  3.   
  4. public class SerdeTest implements Deserializer {  
  5.     private List structFieldNames = new ArrayList();  
  6.     private List structFieldObjectInspectors = new ArrayList();  
  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 result = new ArrayList();  
  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. }  
  57. 3.  生成jar包添加到hive/lib下:

       

    [plain] view plain copy
    print ?
    1. mvn clean package   

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

    [html] view plain copy
    print ?
    1. <property>  
    2.   <name>hive.aux.jars.pathname>  
    3.   <value>file:///home/dp/hive/lib/hive-serde-tool-1.0.1-SNAPSHOT.jarvalue>  
    4. property>  
    4. 创建hive表,指定serde

      

    [plain] view plain copy
    print ?
    1. hive -e "create table test row formated serde 'com.renren.hive.tools.SerdeTest'"  

    5.加载并查询数据

     

    [plain] view plain copy
    print ?
    1. hive -e "load data  local inpath 'f1.txt' overwrite into table test"  
    2.   
    3.  hive -e "select * from test"  

    你可能感兴趣的:(hive,hive,序列化,SerDe)