一、背景
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是大数据生态中不可或缺的一部分,它为Hive提供了解析和处理JSON数据的能力,使得Hadoop环境下的数据仓库可以轻松应对非结构化数据的挑战。通过使用像Hive-JSON-Serde-1.3.8这样的工具,...
`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-...
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.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-...
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-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 是 Apache Hive 的一部分,特别是与 Hive 的执行引擎相关的组件。Apache Hive 是一个构建在 Hadoop 之上的数据仓库基础设施,它允许用户以 SQL(结构化查询语言)的形式查询和管理大型数据集。Hive ...
标题中的"**hive-jdbc-uber-2.6.5.0-292.jar**"是一个Uber(也称为Shaded)JAR文件,它集成了Hive JDBC驱动的所有依赖项。Uber JAR的目的是为了方便部署,因为它将所有必需的库合并到一个单一的文件中,避免了类路径...
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驱动jar包,欢迎下载
"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-3.1.3-src.tar.gz)是一种分布式容错数据仓库系统,支持大规模分析,并使用 SQL 促进读取、写入和管理驻留在分布式存储中的 PB 级数据。Hive 构建在 Apache...
hive-jdbc-3.1.2-standalone适用于linux
标题中的"apache-hive-3.1.2-bin.tar.gz"表明这是一个Hive 3.1.2的二进制发行版,以tar.gz格式压缩。这种压缩包通常包含Hive的可执行文件、库文件、配置文件以及必要的脚本,用于在Linux或Unix环境中快速部署和运行...
Missing Hive Execution Jar: /hive/hive1.2.1/lib/hive-exec-*.jar
hive-jdbc-2.1.0-standalone.jar
安装Yanagishima时,需要将"Hive-jdbc-uber-3.1.2.jar"配置到其类路径中,以便与Hive服务通信。同时,还需要配置Kerberos认证的相关参数,如principal和keytab文件的位置,以确保Yanagishima能够在安全模式下正常...