`

Hive-0.5中SerDe概述

    博客分类:
  • hive
 
阅读更多

Hive-0.5中SerDe概述
propertiesobjecttablestringnullstructure
一、背景

1、当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以二进制序列的形式在网络上传送。发送方需要把对象转化为字节序列才可在网络上传输,称为对象序列化;接收方则需要把字节序列恢复为对象,称为对象的反序列化。

2、Hive的反序列化是对key/value反序列化成hive table的每个列的值。

3、Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。

二、技术细节

1、SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

2、用户在建表时可以用自定义的SerDe或使用Hive自带的SerDe,SerDe能为表指定列,且对列指定相应的数据。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type
    [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...)
  [SORTED BY (col_name [ASC|DESC], ...)]
  INTO num_buckets BUCKETS]
  [ROW FORMAT row_format]
  [STORED AS file_format]
  [LOCATION hdfs_path]
创建指定SerDe表时,使用row format row_format参数,例如:

a、添加jar包。在hive客户端输入:hive>add jar  /run/serde_test.jar;
或者在linux shell端执行命令:${HIVE_HOME}/bin/hive  -auxpath  /run/serde_test.jar
b、建表:create table serde_table row format serde  'hive.connect.TestDeserializer';
3、编写序列化类TestDeserializer。实现Deserializer接口的三个函数:

a)初始化:initialize(Configuration conf, Properties tb1)。

b)反序列化Writable类型返回Object:deserialize(Writable blob)。

c)获取deserialize(Writable blob)返回值Object的inspector:getObjectInspector()。

public interface Deserializer {

  /**
   * Initialize the HiveDeserializer.
   * @param conf System properties
   * @param tbl  table properties
   * @throws SerDeException
   */
  public void initialize(Configuration conf, Properties tbl) throws  SerDeException;
 
  /**
   * Deserialize an object out of a Writable blob.
   * In most cases, the return value of this function will be  constant since the function
   * will reuse the returned object.
   * If the client wants to keep a copy of the object, the client  needs to clone the
   * returned value by calling  ObjectInspectorUtils.getStandardObject().
   * @param blob The Writable object containing a serialized object
   * @return A Java object representing the contents in the blob.
   */
  public Object deserialize(Writable blob) throws SerDeException;

  /**
   * Get the object inspector that can be used to navigate through  the internal
   * structure of the Object returned from deserialize(...).
   */
  public ObjectInspector getObjectInspector() throws SerDeException;

}
实现一行数据划分成hive表的time,userid,host,path四个字段的反序列化类。例如:

package hive.connect;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import  org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import  org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;

public class TestDeserializer implements Deserializer {
   private static List<String> FieldNames = new ArrayList<String>();
   private static List<ObjectInspector> FieldNamesObjectInspectors =  new ArrayList<ObjectInspector>();
   static {
     FieldNames.add("time");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(Long.class,
               ObjectInspectorOptions.JAVA));
     FieldNames.add("userid");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(Integer.class,
               ObjectInspectorOptions.JAVA));
     FieldNames.add("host");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(String.class,
               ObjectInspectorOptions.JAVA));

     FieldNames.add("path");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(String.class,
               ObjectInspectorOptions.JAVA));

   }

   @Override
   public Object deserialize(Writable blob) {
     try {
        if (blob instanceof Text) {
          String line = ((Text) blob).toString();
          if (line == null)
             return null;
          String[] field = line.split("/t");
          if (field.length != 3) {
             return null;
          }
          List<Object> result = new ArrayList<Object>();
          URL url = new URL(field[2]);
          Long time = Long.valueOf(field[0]);
          Integer userid = Integer.valueOf(field[1]);
          result.add(time);
          result.add(userid);
          result.add(url.getHost());
          result.add(url.getPath());
          return result;
        }
     } catch (MalformedURLException e) {
        e.printStackTrace();
     }
     return null;
   }

   @Override
   public ObjectInspector getObjectInspector() throws SerDeException {
     return ObjectInspectorFactory.getStandardStructObjectInspector(
          FieldNames, FieldNamesObjectInspectors);
   }

   @Override
   public void initialize(Configuration arg0, Properties arg1)
        throws SerDeException {
   }

}
测试HDFS上hive表数据,如下为一条测试数据:

1234567891012 123456 http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF

hive> add jar /run/jar/merg_hua.jar;                                           
Added /run/jar/merg_hua.jar to class path
hive> create table serde_table row format serde 'hive.connect.TestDeserializer';
Found class for hive.connect.TestDeserializer
OK
Time taken: 0.028 seconds
hive> describe serde_table;
OK
time    bigint  from deserializer
userid  int     from deserializer
host    string  from deserializer
path    string  from deserializer
Time taken: 0.042 seconds
hive> select * from serde_table;
OK
1234567891012   123456  wiki.apache.org /hadoop/Hive/LanguageManual/UDF
Time taken: 0.039 seconds
三、总结
1、创建Hive表使用序列化时,需要自写一个实现Deserializer的类,并且选用create命令的row format参数。

2、在处理海量数据的时候,如果数据的格式与表结构吻合,可以用到Hive的反序列化而不需要对数据进行转换,可以节省大量的时间。

 

分享到:
评论

相关推荐

    hive-json-serde-0.2.jar

    hive-json-serde-0.2.jar

    Hive-JSON-Serde-1.3.8.zip

    总结来说,Hive-JSON-Serde是大数据生态中不可或缺的一部分,它为Hive提供了解析和处理JSON数据的能力,使得Hadoop环境下的数据仓库可以轻松应对非结构化数据的挑战。通过使用像Hive-JSON-Serde-1.3.8这样的工具,...

    Hive-JSON-Serde-develop

    `Hive-JSON-Serde-develop`项目就是针对JSON数据格式专门设计的一种SerDe,允许用户在Hive中直接处理JSON数据。 标题中的“Hive-JSON-Serde-develop”指的是一个开发项目,旨在为Hive提供对JSON数据的支持。这个...

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-...

    hive-json-serde

    hive-json-serde hive的数组解析json中的数组,Map解析json中的对象:{“ pluginList”:[{“ name”:“ 1”,“ browser”:“ 1”,“ on”:“ 2”},{“ name“:” 1“,” browser“:” 3“,” on“:” 2...

    apache-hive-2.1.1-bin.tar

    apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-...

    Hive-2.1.1-CDH-3.6.1 相关JDBC连接驱动 Jar 包集合

    02、hive-exec-2.1.1-cdh6.3.1.jar 03、hive-jdbc-2.1.1-cdh6.3.1.jar 04、hive-jdbc-2.1.1-cdh6.3.1-standalone.jar 05、hive-metastore-2.1.1-cdh6.3.1.jar 06、hive-service-2.1.1-cdh6.3.1.jar 07、libfb303-...

    hive-jdbc-1.2.1.spark2.jar

    hive-serde-1.1.0,mysql-connector-java-5.1.31.jar,hive-jdbc-standalone,atlas-plugin-classloader-1.2.0,hive-bridge-shim-1.2.0

    hive-exec-2.1.1.jar

    hive-exec-2.1.1 是 Apache Hive 的一部分,特别是与 Hive 的执行引擎相关的组件。Apache Hive 是一个构建在 Hadoop 之上的数据仓库基础设施,它允许用户以 SQL(结构化查询语言)的形式查询和管理大型数据集。Hive ...

    hive驱动包hive-jdbc-uber-2.6.5.0-292.jar(用户客户端连接使用)

    标题中的"**hive-jdbc-uber-2.6.5.0-292.jar**"是一个Uber(也称为Shaded)JAR文件,它集成了Hive JDBC驱动的所有依赖项。Uber JAR的目的是为了方便部署,因为它将所有必需的库合并到一个单一的文件中,避免了类路径...

    hive-java开发驱动包

    hive java开发驱动包列表hive-common-2.3.4.jarhive-exec-2.3.4.jarhive-jdbc-2.3.4.jarhive-llap-client-2.3.4.jarhive-llap-common-2.3.4.jarhive-llap-server-2.3.4.jarhive-llap-tez-2.3.4.jarhive-metastore-...

    hive-jdbc-1.2.1-standalone.jar

    hive-jdbc-1.2.1-standalone.jar hive-jdbc驱动jar包,欢迎下载

    hive-jdbc-jar-多版本.zip

    "hive-jdbc-jar-多版本.zip"是一个压缩包,包含了不同版本的Hive JDBC Uber Jars,覆盖了从1.5到1.8的多个Hive版本,适应不同的项目需求。 首先,我们要理解Uber JAR的概念。Uber JAR(也称为Shaded JAR)是一个...

    Apache Hive(apache-hive-3.1.3-bin.tar.gz)

    Apache Hive(apache-hive-3.1.3-bin.tar.gz、apache-hive-3.1.3-src.tar.gz)是一种分布式容错数据仓库系统,支持大规模分析,并使用 SQL 促进读取、写入和管理驻留在分布式存储中的 PB 级数据。Hive 构建在 Apache...

    hive-jdbc-3.1.2-standalone

    hive-jdbc-3.1.2-standalone适用于linux

    apache-hive-3.1.2-bin.tar.gz

    标题中的"apache-hive-3.1.2-bin.tar.gz"表明这是一个Hive 3.1.2的二进制发行版,以tar.gz格式压缩。这种压缩包通常包含Hive的可执行文件、库文件、配置文件以及必要的脚本,用于在Linux或Unix环境中快速部署和运行...

    hive-exec-*.jar包

    Missing Hive Execution Jar: /hive/hive1.2.1/lib/hive-exec-*.jar

    hive-jdbc-uber-3.1.2+yanagishima-18.0

    安装Yanagishima时,需要将"Hive-jdbc-uber-3.1.2.jar"配置到其类路径中,以便与Hive服务通信。同时,还需要配置Kerberos认证的相关参数,如principal和keytab文件的位置,以确保Yanagishima能够在安全模式下正常...

    hive-jdbc-2.1.0-standalone.jar

    hive-jdbc-2.1.0-standalone.jar

Global site tag (gtag.js) - Google Analytics