1. 程式人生 > >Hive_10. Hive中常用的 SerDe 和 當前社群的狀態

Hive_10. Hive中常用的 SerDe 和 當前社群的狀態

最近在 Google 上看到一篇在 Hive 中利用正則表示式來自定義反序列化處理文字檔案。百度後發現這塊知識目前還沒有人系統的總結一下。

所以我就不才把之前記錄的資料跟大家分享一下:

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 ASTEXTFILEAS
. . . . . . .> SELECT name from employee;
No rows affected (32.665 seconds)
ColumnarSerDe: 用來處理 RCFile 的內建 SerDe jdbc: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)
ParquetHiveSerDe: 用來在 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;
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.

相關推薦

Hive_10. Hive常用SerDe 當前社群狀態

最近在 Google 上看到一篇在 Hive 中利用正則表示式來自定義反序列化處理文字檔案。百度後發現這塊知識目前還沒有人系統的總結一下。所以我就不才把之前記錄的資料跟大家分享一下: SerDe 是Serializer 和 Deserializer 的簡稱。它是 Hive用

大資料技術學習筆記之hive框架基礎2-hive常用DMLUDF連線介面使用

一、分割槽表的介紹及使用     -》需求:統計每一天的PV,UV,每一天分析前一天的資料         -》第一種情況:每天的日誌儲存在同一個目錄中     &nbs

linux常用時間字符串之間相互轉化

時間函數 spa lin cell form time函數 地理 -1 名稱 在Linux中經常會遇到時間和字符串相互轉化的情形,有兩個函數專門對應相應的轉化。 1、時間轉字符串函數strftime 函數原型:size_t strftime(char *s,size_t m

BootStrap 獲得輪播的索引當前活動的焦點對象

當前位置 items com bootstra plain trap div dex ber $(‘#myCarousel‘).on(‘slide.bs.carousel‘, function (event) {   var $hoder = $(‘#myCarousel‘

Hiveif函式Mysqlifnull的轉換

1.在mysql中,ifnull函式的用法,其表示式如下:     IFNULL(expr1,expr2)     如果 expr1 不是 NULL,IFNULL() 返回 expr1,否則它返回 expr2。IFNULL()返

swift常用關鍵字標識

******extention:擴充套件 ********@escaping 閉包只有在函式中做引數時才會區分逃逸閉包和非逃逸閉包。 Swift 3.0之後,傳遞閉包到函式中的時候,系統會預設為非逃逸閉包型別(NonescapingClosures)@n

hive 常用操作

本篇文章主要介紹一下hive的常用sql 操作 新增分割槽 一次新增一個分割槽 ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例 ALTER T

Hive常用的查詢命令

create external table if not exists keyword_20100604_20100603(keyword string, count int, increment int, incrementrate double) stored as INPUTFORMAT 'com.a

學習一下C#常用集合陣列的區別,雖然很基礎,但感覺很實用

在C#中,當我們想要儲存一組物件的時候,就會想到用陣列,ArrayList,List這三個物件了。那麼這三者到底有什麼樣的區別呢?我們先來了解一下陣列,因為陣列在C#中是最早出現的。 陣列 陣列有很多的優點,比如說陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且

ExtJS常用函式(自己總結的,不完全)

Ext類1.  Ext.onReady(Function fn,Object scope,boolean override)2.  Ext.get(Mixed el)3.  Ext.select(String/Array selector,[Boolean unique],[

Kotlin常用操作符用法介紹

?操作符表示這個物件可能為空//在變數型別後面加上問號,代表該變數是可空變數 var name: String? = "zhangsan" /** * 如果str不能轉為Int型別,則返回null */ fun parseInt(str: String): Int?

hive控制mapreduce數量的簡單實現方法

0、先說結論:   由於mapreduce中沒有辦法直接控制map數量,所以只能曲線救國,通過設定每個map中處理的資料量進行設定;reduce是可以直接設定的。  控制map和reduce的引數 set mapred.max.split.size=256000000;

hivercfile orcfileparquetfile對比

一.開始建立三種格式的表: create table rcfile (name string,age int,addr string,desc string) row format delimit

論文寫作常用工具格式排版

1 EndNote文獻編輯軟體 EndNote是一款推薦給大家做論文寫作、學術研究和文獻編輯管理軟體。                                                   2 數學公式編輯器 數學公式編輯器是我們在進行理工類論文寫作時對

關於Hive常用函式需要注意的點小合集

開發十年,就只剩下這套架構體系了! >>>   

Hive靜態分割槽動態分割槽總結

## 目錄 - 背景 - 第一部分 靜態分割槽 - 第二部分 動態分割槽 - 第三部分 兩者的比較 - 第四部分 動態分割槽使用的問題 - 參考文獻及資料 ## 背景 在`Hive`中有兩種型別的分割槽:靜態分割槽(Static Partitioning)和動態分割槽(Dynamic Partitio

Jboss的jmx-console檢視記憶體執行緒狀態

步驟: 1.假設jboss執行在 192.168.1.100:8080 地址和埠上。 3.選擇jboss.system。 選擇type=serverinfo. 檢視記憶體情況: 1.呼叫 listMemoryPools。顯示 code cache , eden space, surviro space ,

PHP常用的超全局變量 表單getpost提交方式的區別 session與cookie的區別 GD庫是做什麽用的

屬性 過程 生成報表 用戶訪問 服務器 接收 file pla request PHP中常用的超全局變量 $_GET ----->get傳送方式$_POST ----->post傳送方式$_REQUEST ----->可以接收到get和post兩種方式的值

學習用Node.jsElasticsearch構建搜索引擎(6):實際項目常用命令使用記錄

nds 黃色 ati cat htm action last shard open 1、檢測集群是否健康。 curl -XGET ‘localhost:9200/_cat/health?v‘#後面加一個v表示讓輸出內容表格顯示表頭 綠色表示一切正常,黃色表示所有

2.mybatis常用的jdbcTypejava數據類型

數據類型 type jdb style short binary ima small ref 2.mybatis中常用的jdbcType和java數據類型 JDBCType JavaType CHAR String