Hive_10. Hive中常用的 SerDe 和 当前社区的状态
来源:互联网 发布:马前课手指算法图解 编辑:程序博客网 时间:2024/05/22 10:49
所以我就不才把之前记录的资料跟大家分享一下:
SerDe 是Serializer 和 Deserializer 的简称。它是 Hive用来处理记录并且将它们映射到 Hive 表中的字段数据类型。为了更好的阐述使用 SerDe 的场景,我们需要了解一下 Hive 是如何读数据的(类似于 HDFS 中数据的读写操作):
1. 从 HDFS 读取数据
2. 通过 InputFormat 来处理数据,根据定义的数据类型来将文件分割成键值对记录。在 Hive 中,我们可以通过 Create Table。。。Stored As <File_Format> 来指定使用哪种 InputFormat 来读取数据。
3. SerDe 中 JAVA 的 Deserializer 会被调用来格式化数据并且映射到表中对应的字段和数据类型。
对于数据读取,我们希望使用 JSON SerDe 来从 HDFS 中读取文本文件格式数据,并且根据正确的 schema 将 JSON每一行的属性和值与 Hive 表中的行进行转换。
如果写入数据:
1. 写入的数据(例如 Insert 语句)会通过 SerDe 定义的 Serlializer 类进行转换成 OutputFormat 类能够读取的格式。
2. 数据会被OutputFormat 继承类进行处理,创建 RecordWrite 对象。类似于 InputFormat 的实现。OutputFormat 的实现方法跟表写入数据的方式相同。
3. 将数据写入到表中(数据将保存在 HDFS)
在实际写入数据的时候,我们可以使用 JSON SerDe来 Hive 表中一个 行列转数据转换成 JSON 文本,保存到 HDFS 中。
Hive 近期发布的 org.apache.hadoop.hive.serde2 库,之前的的 org.apache.hadoop.hive.serde2 库已经摒弃不建议使用了。接下来我们将详细介绍一下 Hive 中常用的 SerDe :
SerDe 类型具体应用LazySimpleSerDe: 内置SerDe(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
) ,用来处理文本文件格式:TEXTFILE
jdbc:hive2://> CREATE TABLE test_serde_lz
. . . . . . .> STORED AS TEXTFILE AS
. . . . . . .> SELECT name from employee;
No rows affected (32.665 seconds)
ColumnarSerDe: 用来处理 RCFile 的内置 SerDejdbc:hive2://> CREATE TABLE test_serde_cs
. . . . . . .> ROW FORMAT SERDE
. . . . . . .> 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
. . . . . . .> STORED ASRCFile AS
. . . . . . .> SELECT name from employee
No rows affected (27.187 seconds)
RegexSerDe: 用来处理文本文件的内置 JAVA 正则表达式 SerDe--Parse , seperate fields
jdbc:hive2://> CREATE TABLE test_serde_rex(
. . . . . . .> name string,
. . . . . . .> sex string,
. . . . . . .> age string
. . . . . . .> )
. . . . . . .> ROW FORMAT SERDE
. . . . . . .> 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
. . . . . . .> WITH SERDEPROPERTIES(
. . . . . . .> 'input.regex' = '([^,]*),([^,]*),([^,]*)',
. . . . . . .> 'output.format.string' = '%1$s %2$s %3$s'
. . . . . . .> )
. . . . . . .> STORED AS TEXTFILE;
No rows affected (0.266 seconds)
HBaseSerDe: 内置的 SerDe,可以让 Hive 跟 HBase 进行集成。我们可以利用 HBaseSerDe 来将 Hive 表存储到 HBase 中。
注意:前提是 HBase 已经安装jdbc:hive2://> CREATE TABLE test_serde_hb(
. . . . . . .> id string,
. . . . . . .> name string,
. . . . . . .> sex string,
. . . . . . .> age string
. . . . . . .> )
. . . . . . .> ROW FORMAT SERDE
. . . . . . .> 'org.apache.hadoop.hive.hbase.HBaseSerDe'
. . . . . . .> STORED BY
. . . . . . .> 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
. . . . . . .> WITH SERDEPROPERTIES (
. . . . . . .> "hbase.columns.mapping"=
. . . . . . .> ":key,info:name,info:sex,info:age"
. . . . . . .> )
. . . . . . .> TBLPROPERTIES("hbase.table.name" = "test_serde");
No rows affected (0.387 seconds)AvroSerDe: 用来在 Hive 表中读写 Avro 数据格式的内置 SerDe(参考:http://avro.apache.org/)
Avro 是一个 RPC 和序列化框架,从 Hive 0.14.0 版本才本地支持 Avro :CREATE TABLE ... STORED AS AVRO
jdbc:hive2://> CREATE TABLE test_serde_avro(
. . . . . . .> name string,
. . . . . . .> sex string,
. . . . . . .> age string
. . . . . . .> )
. . . . . . .> ROW FORMAT SERDE
. . . . . . .> 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
. . . . . . .> STORED AS INPUTFORMAT
. . . . . . .> 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
. . . . . . .> OUTPUTFORMAT
. . . . . . .> 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
. . . . . . .>;
No rows affected (0.31 seconds)
需要注意的是,上述方法是 Hive 0.14.0 版本以前的定义方法,如左边所示,我们可以轻松的使用 Stored as Avro 来指定存储为 Avro 格式。
详细内容请参考:https://cwiki.apache.org/confluence/display/Hive/AvroSerDeParquetHiveSerDe: 用来在 Hive 中读写 Parquet 数据格式的内置 SerDe。从 Hive 0.13.0 版本开始本地支持。jdbc:hive2://> CREATE TABLE test_serde_parquet
. . . . . . .> STORED AS PARQUET AS
. . . . . . .> SELECT name from employee;
No rows affected (34.079 seconds)
OpenCSVSerDe: 用来读写 CSV 数据的 SerDe. 从 Hive 0.14.0 版本才发布的。
我们可以通过从 Github 中下载源码进行安装(https://github.com/ogrodnek/csv-serde )jdbc:hive2://> CREATE TABLE test_serde_csv(
. . . . . . .> name string,
. . . . . . .> sex string,
. . . . . . .> age string
. . . . . . .>)
. . . . . . .> ROW FORMAT SERDE
. . . . . . .> 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
. . . . . . .> STORED AS TEXTFILE;JSONSerDe: 这是一个第三方的 SerDe,用来利用 Hive 读取 JSON 数据记录。
你可以通知下载源码进行安装(https://github.com/rcongiu/Hive-JSON-Serde) jdbc:hive2://> CREATE TABLE test_serde_js(
. . . . . . .> name string,
. . . . . . .> sex string,
. . . . . . .> age string
. . . . . . .> )
. . . . . . .> ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
. . . . . . .> STORED AS TEXTFILE;
No rows affected (0.245 seconds)
最后,为了应对目前存在的各式各样的数据格式以及数据存储系统。Hive 允许用户可以自定义 SerDe 来处理自己的文件格式。更多关于 自定义SerDe 请参考:https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HowtoWriteYourOwnSerDe.当然,为了呼应本次主题,特地跑到 Jira 上搜了一些各个 SerDe 的使用情况,随着大家对这些SerDe的深入研究,需求也越来越多,功能也逐渐被完善着:
LazySimpleSerDe :https://issues.apache.org/jira/browse/HIVE-292?jql=text%20~%20%22LazySimpleSerDe%22
ColumnarSerDe : https://issues.apache.org/jira/browse/HIVE-756?jql=text%20~%20%22ColumnarSerDe%22
RegexSerDe :https://issues.apache.org/jira/browse/HIVE-6336?jql=text%20~%20%22RegexSerDe%22
HBaseSerDe :https://issues.apache.org/jira/browse/HIVE-6677?jql=text%20~%20%22HBaseSerDe%22
AvroSerDe : https://issues.apache.org/jira/issues/?jql=text%20~%20%22AvroSerDe%22
ParquetHiveSerDe:https://issues.apache.org/jira/browse/HIVE-9333?jql=text%20~%20%22ParquetHiveSerde%22
OpenCSVSerDe :https://issues.apache.org/jira/browse/HIVE-7777?jql=text%20~%20%22OpenCSVSerDe%22
JSONSerDe : https://issues.apache.org/jira/browse/HIVE-6166?jql=text%20~%20%22JSONSerDe%22
这里自己为备注一下:
以后有时间再研究一下每个 SerDe 的源码
http://grepcode.com/file/repo1.maven.org/maven2/com.twitter/parquet-hive/1.2.1/parquet/hive/serde/ParquetHiveSerDe.java#ParquetHiveSerDe.initialize%28parquet.hive.serde.Configuration%2Cjava.util.Properties%29
- Hive_10. Hive中常用的 SerDe 和 当前社区的状态
- Hive_10. Hive中常用的 SerDe 和 当前社区的状态
- Hive 的 CSV Serde介绍和使用
- Hive-0.5中SerDe概述 写hive的提示
- Hive 中SerDe概述
- Hive 中SerDe概述
- Hive-0.5中SerDe概述
- Hive-0.5中SerDe概述
- Hive-0.5中SerDe概述
- 【hive】Hive-0.5中SerDe概述
- hive使用serde是出现classnotfind的问题
- hive的三板斧:内部表和外部表、分区和分桶以及序列化/反序列化(SerDe)
- HIVE之Serde和Inspector介绍
- HIVE之Serde和Inspector介绍
- map/reduce的原理| hive 用户手册| hive SERDE | map参数调整 | UDF
- Hive 资料整理系列 五 Hive-0.5中SerDe概述
- hive之SerDe概述
- Hive——SerDe
- Unity3D下NGUI插件使用中文TrueTypeFont(ttf)字库教程
- 使用 后退键/history.back()出现"警告: 网页已过期的解决办法"
- UITableViewCell分割线顶边
- MyBatis 参数类型为String时常见问题解决方法
- Android应用中使用及实现系统“分享”接口
- Hive_10. Hive中常用的 SerDe 和 当前社区的状态
- 在流程图中求支配点的一种快速算法+[CodeChef FEB14]Graph Challenge解题报告(求半支配点)
- PotPlayer播放器在双屏扩展模式下,视频播放时所遇到的几个常见问题的专业解答
- 使用URL访问网络资源
- TextView控件之跑马灯效果
- 基础概念之快速傅里叶变换
- 处女作:行动都去哪儿了?
- 偏函数
- IOS 模拟器中键盘弹起