1. 程式人生 > >hive表的儲存格式 : ORC格式的使用

hive表的儲存格式 : ORC格式的使用

hive表的原始檔儲存格式有幾類:

1、TEXTFILE
預設格式,建表時不指定預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。原始檔可以直接通過hadoop fs -cat 檢視

2、SEQUENCEFILE
一種Hadoop API提供的二進位制檔案,使用方便、可分割、可壓縮等特點。
SEQUENCEFILE將資料以< key,value>的形式序列化到檔案中。序列化和反序列化使用Hadoop 的標準的Writable 介面實現。key為空,用value 存放實際的值, 這樣可以避免map 階段的排序過程。

三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,一般建議使用BLOCK壓縮。使用時設定引數,
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK; – NONE/RECORD/BLOCK
create table test2(str STRING) STORED AS SEQUENCEFILE;

3、RCFILE
一種行列儲存相結合的儲存方式。首先,其將資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊資料列式儲存,有利於資料壓縮和快速的列存取。
理論上具有高查詢效率(但hive官方說效果不明顯,只有儲存上能省10%的空間,所以不好用,可以不用)。
RCFile結合行儲存查詢的快速和列儲存節省空間的特點
1)同一行的資料位於同一節點,因此元組重構的開銷很低;
2) 塊內列儲存,可以進行列維度的資料壓縮,跳過不必要的列讀取。

查詢過程中,在IO上跳過不關心的列。實際過程是,在map階段從遠端拷貝仍然拷貝整個資料塊到本地目錄,也並不是真正直接跳過列,而是通過掃描每一個row group的頭部定義來實現的。
但是在整個HDFS Block 級別的頭部並沒有定義每個列從哪個row group起始到哪個row group結束。所以在讀取所有列的情況下,RCFile的效能反而沒有SequenceFile高。

4、ORC hive給出的新格式,屬於RCFILE的升級版。
ORC是RCfile的升級版,效能有大幅度提升,而且資料可以壓縮儲存,壓縮比和Lzo壓縮差不多,比text檔案壓縮比可以達到70%的空間。而且讀效能非常高,可以實現高效查詢。
具體介紹https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

注意:

只有TEXTFILE表能直接載入資料,必須,本地load資料,和external外部表直接載入運路徑資料,都只能用TEXTFILE表。

更深一步,hive預設支援的壓縮檔案(hadoop預設支援的壓縮格式),也只能用TEXTFILE表直接讀取。其他格式不行。可以通過TEXTFILE表載入後insert到其他表中。

換句話說,SequenceFile、RCFile表不能直接載入資料,資料要先匯入到textfile表,再從textfile表通過insert select from 匯入到SequenceFile,RCFile表。

SequenceFile、RCFile表的原始檔不能直接檢視,在hive中用select看。

RCFile原始檔可以用 hive –service rcfilecat /xxx/000000_0檢視,但是格式不同,很亂。
ORCFile原始檔可以用 hive –orcfiledump來進行分析ORC儲存檔案,就可以看到這些資訊:
hive –orcfiledump < path_to_file>

建表語句如下:
同時,將ORC的表中的NULL取值,由預設的\N改為”,

ORC三種建立/使用方式:
1, STORED AS ORC;
2, ROW FORMAT SERDE ‘org.apache.hadoop.hive.ql.io.orc.OrcSerde’ with serdeproperties(‘serialization.null.format’ = ”) STORED AS ORC;
3, ROW FORMAT DELIMITED NULL DEFINED AS ” STORED AS ORC;

方式一

create table if not exists test_orc(
  advertiser_id string,
  ad_plan_id string,
  cnt BIGINT
) partitioned by (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT)
STORED AS ORC;

alter table test_orc set serdeproperties('serialization.null.format' = '');

方式二

drop table test_orc;
create table if not exists test_orc(
  advertiser_id string,
  ad_plan_id string,
  cnt BIGINT
) partitioned by (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
with serdeproperties('serialization.null.format' = '')
STORED AS ORC;

方式三

drop table test_orc;
create table if not exists test_orc(
  advertiser_id string,
  ad_plan_id string,
  cnt BIGINT
) partitioned by (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT)
ROW FORMAT DELIMITED 
  NULL DEFINED AS '' 
STORED AS ORC;

檢視結果

hive> show create table test_orc;
CREATE  TABLE `test_orc`(
  `advertiser_id` string, 
  `ad_plan_id` string, 
  `cnt` bigint)
PARTITIONED BY ( 
  `day` string, 
  `type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', 
  `hour` tinyint)
ROW FORMAT DELIMITED 
  NULL DEFINED AS '' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://namenode/hivedata/warehouse/pmp.db/test_orc'
TBLPROPERTIES (
  'transient_lastDdlTime'='1465992916')

相關推薦

hive儲存為parquet格式

Hive0.13以後的版本 建立儲存格式為parquet的hive表: CREATE TABLE parquet_test ( id int, str string, mp MAP<STRING,STRING>, lst ARRAY<STRING

hive儲存格式 : ORC格式的使用

hive表的原始檔儲存格式有幾類: 1、TEXTFILE 預設格式,建表時不指定預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。原始檔可以直接通過hadoop fs -cat 檢視 2、SEQUENCEFILE 一種Hadoop

hive的原始檔儲存格式

Hive檔案儲存格式 1.textfile textfile為預設格式 儲存方式:行儲存 磁碟開銷大 資料解析開銷大,壓縮的text檔案 hive無法進行合併和拆分 (建表時不指定它會預設為這個格式,匯入資料時會直接把資料檔案拷貝到HDFS上不進行處理,原始檔可以直接通過ha

hive內部分割槽(ORC格式)新增欄位後出現的問題

hive內部分割槽表(ORC格式)在新增欄位後出現的問題:1、在新增欄位後的分割槽內查詢資料正常2、在新增欄位前的分割槽內查詢資料異常3、分割槽刪不掉,一直卡著不動出現原因:當我們修改hive表結構以後,mysql中元資料庫中的SDS中該hive表對應的CD_ID會改變,但是

Hive資料匯入方案—使用ORC格式儲存hive資料

目的:將上網日誌匯入到hive中,要求速度快,壓縮高,查詢快,表易維護。推薦使用ORC格式的表儲存資料 思路:因為在hive指定RCFile格式的表,不能直接load資料,只能通過textfile表進行insert轉換。考慮先建立txtFile格式內部臨時表tmp_test

opencv3.3 該檔案包含不能在當前內碼(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失

VS2015 + opencv3.3 執行報錯: warning C4819: 該檔案包含不能在當前內碼表(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失  error C2065: “ptr”: 未宣告的識別符號 error C2065: “ptr”:

VS2017 報錯該檔案包含不能在當前內碼(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失

尤其程式碼是從linux平臺複製過來: 報錯如圖: 更有甚者基本函式都報錯: 當下檢查發現if else break case等基本函式並無問題時,報錯行數明顯不一致等一定要注意文件編碼格式, 最簡單的辦法是用notepad++,逐個將.

Hive儲存格式

常用的儲存格式 1.textfile Hive資料表的預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。儲存方式:行儲存。 可以使用Gzip壓縮演算法,但壓縮後的檔案不支援split。 在反序列化過程中,必須逐個字元判斷是不是分隔符和行結束符,因此反序列化開銷會比SequenceFile高几十倍。

經驗分享(7)建立hive格式如何選擇

常用的幾種格式: textfile 需要定義分隔符,佔用空間大,讀寫效率最低,非常容易發生衝突(分隔符)的一種格式,基本上只有需要匯入資料的時候才會使用,比如匯入csv檔案; json 需要匯入jar,http://www.congiu.net/hive-json-serde/,佔用空間最大,讀寫效率

form資料Map反射和設定儲存的日期格式

註冊時form表資料Map反射 @Override public void register(Map<String, String[]> parameterMap) { // TODO Auto-generated method stub User user=TB

《 warning C4819: 該檔案包含不能在當前內碼(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失》

問題描述 最近專案中添加了很多外部的.h和.cpp檔案,有可能是編碼格式不一樣,在生成解決方案時,輸出窗口出現了好多的warning C4819警告資訊,具體情況如下所示: warning C4819: 該檔案包含不能在當前內碼表(936)中表示的字元。 請將該檔案儲存為

[Hive_add_9] Hive儲存格式

0. 說明   Hive 的儲存格式 | textfile | sequencefile | rcfile | orc | parquet |     1. Hive的儲存格式   1.1 textfile   行式儲存 

遇見hive之記憶篇--運用sqoop對資料的同步的常見錯誤,及hive儲存格式分析(壓縮格式

前面所記載的差不多都涵蓋到了,但是總是覺得有很多知識點沒有記到,在這裡梳理一遍1、sqoop的匯入,這次測試完全分散式對sqoop的快速匯入的測試嘗試了cdh分散式下的hive的配置,及sqoop的配置,才發現和偽分散式的單節點的部署一模一樣,並沒有其他要注意的東西,就那個,

hive與json:使用HDFS上的json格式資料建立hive

add jar /home/xxx/hive-hcatalog-core-2.1.0.jar 2.建立表 CREATE TABLE json_table(id bigint, sour

VS2017 warning C4819: 該檔案包含不能在當前內碼(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失

Visual Studio 2017出現warning C4819: 該檔案包含不能在當前內碼表(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失 解決方案: 1.修改字元編碼格式 Visual Studio提供高階儲存選項功能,

“該檔案包含不能在當前內碼(936)中表示的字元,請將該檔案儲存為 Unicode 格式以防止資料丟失”

這個警告怎麼破?其實很簡單: 以VS2012為例,去除方法見下: ------------------------------------------- 影象處理開發資料、影象處理開發需求、

Hive檔案儲存格式 :Parquet sparksql ,impala的殺手鐗

hive表的原始檔儲存格式有幾類: 1、TEXTFILE 預設格式,建表時不指定預設為這個格式,儲存方式:行儲存 匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。原始檔可以直接通過hadoop fs -cat 檢視 磁碟開銷大 資料解析開銷大,壓縮的text檔案

hive 檔案儲存parquet格式, sparkSql解析部分欄位為null

CREATE EXTERNAL TABLE `rule_business_log3`(   `id` bigint,    `businesscode` string,    `businessdesc` string,    `comment` string,    `orderno` string,   

Spark SQL解析查詢parquet格式Hive獲取分割槽欄位和查詢條件

首先說一下,這裡解決的問題應用場景: sparksql處理Hive表資料時,判斷載入的是否是分割槽表,以及分割槽表的欄位有哪些?再進一步限制查詢分割槽表必須指定分割槽? 這裡涉及到兩種情況:select SQL查詢和載入Hive表路徑的方式。這裡僅就"載入Hive表路徑的方式"解析分割槽表字段,在處理時出現的

hive欄位拼接json格式

hive用named_struct(‘欄位1’,欄位1,‘欄位2’,欄位2) 可以拼接json,並且特別方便 用最原始的方法拼接json: startdate=`date -d '-1 days' +%Y-%m-%d` date=`date '+%Y-%m-%d %H:%M:%S'`