1. 程式人生 > >Hive SQL(分割槽和分桶)

Hive SQL(分割槽和分桶)

1.HIVE 分割槽表

在 hive select 查詢中一般會掃描整個內容,消耗很多時間組沒必要的工作.有時候只需要掃描表中的一部分關心的資料,因此建表時引入了partition 概念.

分割槽表指的是在建立表時指定的partition的分割槽空間,Hive可以對資料按照某列或者某些列進行分割槽管理

\舉個例子:當前網際網路應用每天都要儲存大量的日誌檔案,幾G、幾十G甚至更大都是有可能。儲存日誌,其中必然有個屬性是日誌產生的日期。在產生分割槽時,就可以按照日誌產生的日期列進行劃分。把每一天的日誌當作一個分割槽

將資料組織成分割槽,主要可以提高資料的查詢速度.至於使用者儲存的每一條記錄到底放在哪個分割槽,由使用者來決定.即使用者在載入資料的時候必須現實地指定該部分資料放到哪.個分割槽

1.1實現細節

  • 一個表可以擁有一個或者多個分割槽,每個分割槽以資料夾的形式單獨存放在表文件夾的目錄
  • 表和列名不區分大小寫
  • 分割槽十一欄位的形式在表結構中存在,通過describe table 命令可以檢視到欄位存在,但是該欄位不存放實際的資料內容,僅僅是分割槽的表示

1.2語法

建立一個分割槽表:

create table table_name(

id int ,name string)

partitioned  by (year int, month int)

row format delimited

fields terminated by '|'

collection items terminated by ','

map keys terminated by ':'

新增分割槽

alter table table_name add partition (year=2017,month=6) partition (year=2017,month=7) partition (year=2018,month=8);

動態分割槽的新增(在新增資料時自動生成分割槽)

注意:使用者必須現制定一個靜態分割槽列

先確認配置為true

set hive.exec.dynamic.partition

確認為true後再修改 hive.exec.dynamic.paritition.mode=nonstrict

set hive.exec.dynamic.partition.mode=nonstrict

自動新增一個沒有的2018-9的分割槽

insert into table table_name partition (year=2018,month) values ('lisi','2018-8-12',8),('zhangsan','2018-9-10',9);

2.nonstrictHive 桶

對於每個表(table) 或者分割槽,hive 可以進一步組織成桶,也就是說桶時更為精細的資料範圍劃分.hive 也是針對某一列進行桶的組織. hive採用佇列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在那個桶中

把表(或者分割槽)組織成桶有兩個理由:

(1)獲得更高的查詢處理效率.桶為表加上了額外的結構,hive 在處理有些查詢時利用這個結構,具體而言,連線兩個在相同列上劃分了桶的表,可以用map連線(map-side join) 高效的實現.比如join操作 對於join操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作,那麼將儲存相同列值的通進行join操作就可以,可以大大減少join的資料量

(2)取樣更高效.在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便

2.1語法

create table bucketed_user(

id int,name string)

clustered by (bucketed_user) into 2 buckets

row format delimited
fields terminated by '|'

collection items terminated by','

map keys terminated by ':'

stored as textfile; 

隨機抽樣基於整行資料

select * from table_name tablesample(bucket 3 out of 32 on rand()) s;

隨機抽樣基於指定列(使用分桶列更高效)

select * from table_name tablesample(bucket 3 out of 32 on id) s;

隨機抽樣基於block size

SELECT * FROM table_name TABLESAMPLE(10 PERCENT) s;

SELECT * FROM table_name TABLESAMPLE(1M) s;

SELECT * FROM table_name TABLESAMPLE(10 rows) s;

3.Hive 檢視常用操作

語法:

  • 建立檢視: create view view_name as select statement;
  • 建立檢視支援  CTE,ORDER BY,LIMIT,JOIN,etc
  • 查詢檢視 show tables;(show views after hive v2.2.0)
  • 顯示view :show create table view_name;
  • 刪除檢視:drop view_name;
  • 更改檢視屬性 :alter view view_name set tblproperties('comment'='This is view');
  • 更改檢視定義:alter view view_name as select statement; 

Hive 排序

  1. order by 會對資料進行全域性排序,和oracle和mysql等資料庫中的order by 效果一樣,他只在一個reduce中進行,所以資料量特別大的時候效率特別低
  2. sort by 是單獨在各自的reduce中進行排序,所以並不能保證全域性排序,一般和distribute by一起執行,而且distribute by 要寫在sort by 前面
  3. distribute by 會對指定的欄位按照hashCode值對reduce的個數取模,然後將任務分配到對應的reduce中去執行,就是在mapreduce程式中的patition分割槽過程,預設根據指定key.hashCode()確定處理該人物的reduce
  4. cluster by :distribute by 和sort by 合用就相當於cluster by 但是 cluster不能指定排序asc或者desc的規則,只能是desc倒序排列

Hive 資料的匯入與匯出

load data 加 local 和不加local的區別
```local 是匯入本地檔案  採用複製方式
```不加local 是匯入hdfs資料  採用剪下
use school;
export table class to 'tmp/out'(先將表匯出到hdfs資料夾)
use school;
import table class2 from 'tmp/out'(再從dfs檔案中匯入新的表中)
HIVE 排序

row_number: 排名不重複,序號連續

rank:排名重複序號不連續

dense_rank:排名重複,序號連續

相關推薦

Hive SQL(分割槽)

1.HIVE 分割槽表 在 hive select 查詢中一般會掃描整個內容,消耗很多時間組沒必要的工作.有時候只需要掃描表中的一部分關心的資料,因此建表時引入了partition 概念. 分割槽表指的是在建立表時指定的partition的分割槽空間,Hive可以對資料按

hive分割槽

1.Hive分割槽表 Hive使用select語句進行查詢的時候一般會掃描整個表內容,會消耗很多時間做沒必要的工作。Hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效率。 建立分割槽表的語法: create table tablen

能說一下你們專案中hive的庫表設計嗎---庫表設計三板斧---內外部表|分割槽|序列化反序列化

資料倉庫的起源可以追溯到計算機與資訊系統發展的初期。它是資訊科技長期複雜演化的產物,並且直到今天這種演化仍然在繼續進行著。而資料倉庫容易讓人糊塗的地方在於它是一種體系結構,而不是一種技術。這點使得許多技術人員和風投都感到沮喪,因為他們希望的是打好成包的專業技術,而非

hive的三板斧:內部表外部表、分割槽以及序列化/反序列化(SerDe)

hive的三板斧:內部表和外部表、分割槽和分桶以及序列化/反序列化(SerDe)   Hive是Hadoop生態圈中實現資料倉庫的一項技術。雖然Hadoop和HDFS的設計侷限了Hive所能勝任的工作,但是Hive仍然是目前網際網路中最適合資料倉庫的應用技術。 不論從“品相還是舉止

HIVE—索引、分割槽的區別

一、索引 Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。 Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。 為什麼要建立索引? Hive的索引目的是

Hive分割槽

Hive把表組織成分割槽(partition)。這是一種根據分割槽列(partition column,如日期)的值對錶進行粗略的劃分機制。使用分割槽可以加快資料分片(slice)的查詢速度。 表或分割槽可以進一步劃分為桶(bucket)。它會為資料提供額外的結構以獲取更高

Hive常用函式

Hive常用函式和分桶表 一、字串常用函式 二、分桶表   分桶操作是更細粒度的分配方式,一張表可以同時分割槽和分桶,分桶的原理是根據指定的列的計算hash值模餘分桶數量後將資料分開存放。   Hive的分桶實際上就是Hadoop的分割槽,有幾個桶,就用幾個reduce

hive sql分割槽條件優化

分割槽過濾 如果不加分割槽,預設會掃描整個表的資料 如何查看錶有哪些分割槽:show partitions databaseName.tableName 如何確認分割槽是否生效:explain de

Hive面試題:Hive分割槽表的區別

分割槽在HDFS上的表現形式是一個目錄, 分桶是一個單獨的檔案 分割槽:  細化資料管理,直接讀對應目錄,縮小mapreduce程式要掃描的資料量 分桶:   1、提高join查詢的效率(用分桶欄位做連線欄位)    

一起學Hive——建立內部表、外部表、分割槽表及匯入資料

Hive本身並不儲存資料,而是將資料儲存在Hadoop的HDFS中,表名對應HDFS中的目錄/檔案。根據資料的不同儲存方式,將Hive表分為外部表、內部表、分割槽表和分桶表四種資料模型。每種資料模型各有優缺點。通過create user命令建立user表時,會在HDFS中生成一個user目錄/檔案。 外部表

資料倉庫hive語句中的分割槽

    資料倉庫中從各資料來源獲取資料以及在資料倉庫內的資料轉換和流動都可以認為是ETL(抽取Extra,轉化Transfer,裝載Load)的過程,ETL是資料倉庫的流水線.資料倉庫(data warehouse)與資料庫的區別:資料倉庫(data warehouse)--

Hive 系列(五)—— Hive 分割槽

一、分割槽表 1.1 概念 Hive 中的表對應為 HDFS 上的指定目錄,在查詢資料時候,預設會對全表進行掃描,這樣時間和效能的消耗都非常大。 分割槽為 HDFS 上表目錄的子目錄,資料按照分割槽儲存在子目錄中。如果查詢的 where 字句的中包含分割槽條件,則直接從該分割槽去查詢,而不是掃描整個表目錄,合

HIVE—索引、的區別

處理 拆分 功能 分布 哈希函數 對比 part 一致性 進一步 一、索引 簡介 Hive支持索引,但是Hive的索引與關系型數據庫中的索引並不相同,比如,Hive不支持主鍵或者外鍵。 Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapRedu

HIVE分割槽以及的簡單概念

1、Hive 分割槽表 在Hive Select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分資料,因此建表時引入了partition概念。分割槽表指的是在建立表時指定的partition的分割槽空間。  Hive可以對資料按照某

HIVE 分割槽

//分割槽表,優化手段之一,從目錄的層面控制搜尋資料的範圍。     //建立分割槽表.     $hive>CREATE TABLE t3(id int,name string,age int) PARTITIONED BY (Year INT, Month INT)

Hive表的分割槽

1.Hive分割槽表 Hive使用select語句進行查詢的時候一般會掃描整個表內容,會消耗很多時間做沒必要的工作。Hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效

第二十一天 -- hive補充 -- hive分割槽 -- hive資料匯入匯出

第二十一天 – hive補充 – hive分割槽、分桶 – hive資料匯入匯出 一、Hive基礎補充 使用的表及表資料 dept CREATE TABLE dept( deptno int, dname string, loc strin

Hive中索引,分割槽的對比

一、索引Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。為什麼要建立索引?Hive的索引目的是提高Hiv

大資料Hive的案例、引數、動態分割槽、檢視、索引、執行方式、許可權管理、Hive的優化_03_03

一、案例:統計出掉線率最高的前10基站 需求:統計出掉線率最高的前10基站 資料: record_time:通話時間 imei:基站編號 cell:手機編號 drop_num:掉話的秒數duration:通話持續總秒數 1.建表 create table cell_mon

Hive的排序以及抽樣查詢

排序 全域性排序(Order by) :一個MapReduce 使用order by子句查詢 ASC(ascend):升序(預設) DESC(descend):降序 Order by子句在Select語句結尾 查詢員工資訊按工資升序排列 select * fr