hive工作中分享总结
hive分享總結(jié)
- 1. 數(shù)據(jù)家譜:
- 1.1.Hive 是什么?
- 1.2.數(shù)據(jù)倉(cāng)庫(kù)
- 1.3.Hive與傳統(tǒng)數(shù)據(jù)庫(kù)的區(qū)別
- 1.4.Hive的優(yōu)缺點(diǎn)
- 1.5.Hive使用場(chǎng)景
- 1.6.Hdfs 運(yùn)行機(jī)制
- 1.7.Mapreduce 運(yùn)行機(jī)制
- 1.8.SQL轉(zhuǎn)化成MapReduce過(guò)程
- 1.9.Hive 架構(gòu):
- 2.Hive交互方式
- 2.1.Hive交互shell
- 2.2.JDBC交互
- 2.3.第三種交互方式:
- 3.Hive 基礎(chǔ)
- 3.1.hive 支持的基本類(lèi)型
- 3.2.基本SQL語(yǔ)句
- 3.3.排序
- 3.4.行轉(zhuǎn)列
- 3.5.列轉(zhuǎn)行
- 3.6.hive 內(nèi)連接外連接
- 3.7.Hive 存儲(chǔ)格式
- 3.7.1.行存儲(chǔ)和列存儲(chǔ)
- 3.7.2.textfile 格式:
- 3.7.3.Orc 格式
- 3.7.4.Parquet 存儲(chǔ)格式
- 3.8.內(nèi)部表/外部表
- 3.9.hive元數(shù)據(jù)存儲(chǔ)
- 3.10.分區(qū):
- 3.11.分桶:
- 3.12 大數(shù)據(jù)應(yīng)用架構(gòu)
- 3.13 數(shù)據(jù)倉(cāng)庫(kù)架構(gòu)
- 4.遇到的問(wèn)題;
- 4.1.Hive sql 執(zhí)行的順序與mysql 對(duì)比:
- 4.1.1 sql 執(zhí)行順序
- 4.2.Hive update 需要表設(shè)置
- 4.3.Hive腳本中設(shè)置變量
- 4.7批量更新
- 4.71 批量更新語(yǔ)法
- 4.5 函數(shù)
- 4.6.Hive 自定義udf 函數(shù)
- 4.6.1 臨時(shí)函數(shù)
- 4.6.2 永久函數(shù)
- 4.7.Hive 優(yōu)化:
- 4.7.1.Fetch 抓取
- 4.7.2.本地模式:
- 4.7.3.大表join 小表 mapjoin設(shè)置
- 4.7.4.Mapjoin
- 4.7.5.Group by 優(yōu)化
- 4.7.6.Count(distinct) 去重統(tǒng)計(jì)
- 4.7.7.笛卡爾積:
- 4.7.8.行列過(guò)濾
- 4.7.9.動(dòng)態(tài)分區(qū)
- 4.7.10.數(shù)據(jù)傾斜
- 4.7.10.1.小文件合并:
- 4.7.10.2.復(fù)雜文件增加Map數(shù)量
- 4.7.10.3.設(shè)置reduce的數(shù)量
- 4.7.10.4.并行執(zhí)行
- 4.7.10.5.Hive 嚴(yán)格模式
- 4.7.10.6.Jvm重用
- 4.7.10.7.推測(cè)執(zhí)行
- 4.7.10.8.壓縮見(jiàn)hive格式
- 4.7.10.9.explain
- 5.Sqoop語(yǔ)句如下:
- 6.Hive 高級(jí)函數(shù):
- 7 常見(jiàn)的面試題
- 7.1.Left semi join 和left join 的區(qū)別
- 7.2.數(shù)據(jù)庫(kù)拉鏈表
- 7.3 抽取數(shù)據(jù)庫(kù)中存在json數(shù)據(jù)怎么處理
- 7.4 求日環(huán)比和月環(huán)比
- 7.5 數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)集市
- 8. hadoop-yarn 參數(shù)調(diào)優(yōu)
很抱歉最近找房子,hive 分享一直想更新,一直被耽擱
工作中設(shè)計(jì)到數(shù)倉(cāng)的建設(shè),還有存儲(chǔ)過(guò)程到hive 腳本的改造 目前只能整理到第四章
1. 數(shù)據(jù)家譜:
- 關(guān)系型數(shù)據(jù)庫(kù)
- 非關(guān)系型數(shù)據(jù)庫(kù)
- 數(shù)據(jù)倉(cāng)庫(kù)
1.1.Hive 是什么?
? ?Hive 是一個(gè)類(lèi)SQL 能夠操作hdfs 數(shù)據(jù)的數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)架構(gòu)
Hive 是一個(gè)SQL 的解析引擎,能夠?qū)SQL翻譯MR在hadoop 中執(zhí)行。
hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供簡(jiǎn)單的sql查詢功能,可以將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。 其優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過(guò)類(lèi)SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專(zhuān)門(mén)的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。
總結(jié):
Hive 是一個(gè)類(lèi)SQL 能夠操作hdfs 數(shù)據(jù)的數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)架構(gòu)
Hive 是一個(gè)SQL 的解析引擎,能夠?qū)SQL翻譯MR在hadoop 中執(zhí)行。
1.2.數(shù)據(jù)倉(cāng)庫(kù)
??數(shù)據(jù)倉(cāng)庫(kù),英文名稱(chēng)為Data Warehouse,可簡(jiǎn)寫(xiě)為DW或DWH。數(shù)據(jù)倉(cāng)庫(kù),是為企業(yè)所有級(jí)別的決策制定過(guò)程,提供所有類(lèi)型數(shù)據(jù)支持的戰(zhàn)略集合。它是單個(gè)數(shù)據(jù)存儲(chǔ),出于分析性報(bào)告和決策支持目的而創(chuàng)建。 為需要業(yè)務(wù)智能的企業(yè),提供指導(dǎo)業(yè)務(wù)流程改進(jìn)、監(jiān)視時(shí)間、成本、質(zhì)量以及控制,簡(jiǎn)而言之,數(shù)據(jù)倉(cāng)庫(kù)是用來(lái)做查詢分析的數(shù)據(jù)庫(kù),基本不用來(lái)做插入,修改,刪除;
1.3.Hive與傳統(tǒng)數(shù)據(jù)庫(kù)的區(qū)別
注意hive讀時(shí)模式:Hive在加載數(shù)據(jù)到表中的時(shí)候不會(huì)校驗(yàn).
(備注 讀模式
數(shù)據(jù)被加載到數(shù)據(jù)庫(kù)的時(shí)候,不對(duì)其合法性進(jìn)行校驗(yàn),只在查詢等操作的時(shí)候進(jìn)行校驗(yàn),特點(diǎn):加載速度快,適合大數(shù)據(jù)的加載
寫(xiě)模式
數(shù)據(jù)被加載到數(shù)據(jù)庫(kù)的時(shí)候,需對(duì)其合法性進(jìn)行校驗(yàn),數(shù)據(jù)庫(kù)中的數(shù)據(jù)都是合法的數(shù)據(jù),特點(diǎn):加載速度慢,但是查詢速度快。)
寫(xiě)時(shí)模式:Mysql數(shù)據(jù)庫(kù)插入數(shù)據(jù)到表的時(shí)候會(huì)進(jìn)行校驗(yàn).
總結(jié):Hive只適合用來(lái)做海量離線的數(shù)據(jù)統(tǒng)計(jì)分析,也就是數(shù)據(jù)倉(cāng)庫(kù)。
1.4.Hive的優(yōu)缺點(diǎn)
?? 優(yōu)點(diǎn):操作接口采用了類(lèi)SQL語(yǔ)法,提供快速開(kāi)發(fā)的能力,避免了去寫(xiě)MapReduce;Hive還支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求實(shí)現(xiàn)自己的函數(shù)。
缺點(diǎn):Hive查詢延遲很?chē)?yán)重。
1.5.Hive使用場(chǎng)景
- 數(shù)據(jù)的離線處理;比如:日志分析,海量結(jié)構(gòu)化數(shù)據(jù)離線分析…
- Hive的執(zhí)行延遲比較高,因此hive常用于數(shù)據(jù)分析的,對(duì)實(shí)時(shí)性要求不高的場(chǎng)合;
- Hive優(yōu)勢(shì)在于處理大數(shù)據(jù),對(duì)于處理小數(shù)據(jù)沒(méi)有優(yōu)勢(shì),因?yàn)镠ive的執(zhí)行延遲比較高。
1.6.Hdfs 運(yùn)行機(jī)制
https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html
1.7.Mapreduce 運(yùn)行機(jī)制
參考博客1
參考博客2
1.8.SQL轉(zhuǎn)化成MapReduce過(guò)程
- Hive是如何將SQL轉(zhuǎn)化為MapReduce任務(wù)的,整個(gè)編譯過(guò)程分為六個(gè)階段:
- 1-Antlr定義SQL的語(yǔ)法規(guī)則,完成SQL詞法,語(yǔ)法解析,將SQL轉(zhuǎn)化為抽象語(yǔ)法樹(shù)AST Tree;
- 2-遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
- 3-遍歷QueryBlock,翻譯為執(zhí)行操作樹(shù)OperatorTree;
- 4-邏輯層優(yōu)化器進(jìn)行OperatorTree變換,合并不必要的ReduceSinkOperator,減少shuffle數(shù)據(jù)量;
- 5-遍歷OperatorTree,翻譯為MapReduce任務(wù);
- 6-物理層優(yōu)化器進(jìn)行MapReduce任務(wù)的變換,生成最終的執(zhí)行計(jì)劃。
1.9.Hive 架構(gòu):
(1) 用戶接口:CLI(hive shell);JDBC(java訪問(wèn)Hive);WEBUI(瀏覽器訪問(wèn)Hive)
? (2)元數(shù)據(jù):MetaStore
元數(shù)據(jù)包括:表名、表所屬的數(shù)據(jù)庫(kù)(默認(rèn)是default)、表的擁有者、列/分區(qū)字段,標(biāo)的類(lèi)型(表是否為外部表)、表的數(shù)據(jù)所在目錄。這是數(shù)據(jù)默認(rèn)存儲(chǔ)在Hive自帶的derby數(shù)據(jù)庫(kù)中,推薦使用MySQL數(shù)據(jù)庫(kù)存儲(chǔ)MetaStore。
(3)Hive使用HDFS存儲(chǔ)數(shù)據(jù)(.Hadoop集群):
使用HDFS進(jìn)行存儲(chǔ)數(shù)據(jù),使用MapReduce進(jìn)行計(jì)算。
(4)Driver:驅(qū)動(dòng)器
解析器(SQL Parser):將SQL字符串換成抽象語(yǔ)法樹(shù)AST,對(duì)AST進(jìn)行語(yǔ)法分析,像是表是否存在、字段是否存在、SQL語(yǔ)義是否有誤。
編譯器(Physical Plan):將AST編譯成邏輯執(zhí)行計(jì)劃。
優(yōu)化器(Query Optimizer):將邏輯計(jì)劃進(jìn)行優(yōu)化。
執(zhí)行器(Execution):把執(zhí)行計(jì)劃轉(zhuǎn)換成可以運(yùn)行的物理計(jì)劃。對(duì)于Hive來(lái)說(shuō)默認(rèn)就是Mapreduce任務(wù)。
2.Hive交互方式
2.1.Hive交互shell
./hive 命令方式
bin/hive
2.2.JDBC交互
輸入hiveserver2相當(dāng)于開(kāi)啟了一個(gè)服務(wù)端,查看hivesever2的轉(zhuǎn)態(tài)
輸入netstat –nlp命令查看:
運(yùn)行hiveserver2相當(dāng)于開(kāi)啟了一個(gè)服務(wù)端,端口號(hào)10000,需要開(kāi)啟一個(gè)客戶端進(jìn)行通信,所以打開(kāi)另一個(gè)窗口,輸入命令beeline.
Example : :
beeline -u jdbc:hive2://192.168.122.1:10000/default -n hive-p hive@12
beeline -u jdbc:hive2://192.168.122.1:10000/default -n hive-p hive@12 -e ‘select * from dual;’
2.3.第三種交互方式:
使用sql語(yǔ)句或者sql腳本進(jìn)行交互
vim hive.sql
create database if not exists mytest; use mytest; create table stu(id int,name string);
hive -f /export/servers/hive.sql
3.Hive 基礎(chǔ)
3.1.hive 支持的基本類(lèi)型
3.2.基本SQL語(yǔ)句
insert、delete、update、select
多表查詢與代數(shù)運(yùn)算
內(nèi)連接
外鏈接
左連接
右鏈接
交叉鏈接
條件查詢
Select where
Select order by
Select group by
Select join
目前使用方式: 將sql 封裝到 sh
例如:/home/hadoop/sh/bet_rr_indicator_1.0.sh
3.3.排序
全局排序:
Order by 全局排序,只有一個(gè)reducer
Sort by 每個(gè)reducer 內(nèi)部配置 需要設(shè)置reducer 個(gè)數(shù):
Distribute by
Cluster by 只能升序排序:
3.4.行轉(zhuǎn)列
3.5.列轉(zhuǎn)行
排序函數(shù)
Rank() 對(duì)應(yīng)下圖 rand_window_0
Dense_rank() 對(duì)應(yīng)下圖_ dense_rank_window_1
Row_number() 對(duì)應(yīng)下圖 row_number_window_2
3.6.hive 內(nèi)連接外連接
多表查詢與代數(shù)運(yùn)算
內(nèi)連接:
外鏈接
右連接:
3.7.Hive 存儲(chǔ)格式
自定義編譯(練習(xí))
Hive 查看存儲(chǔ)格式:
hadoop checknative
Snappy 得添加snappy 的jar 重新編譯hadoop.jar
Map 設(shè)置壓縮方式:
驗(yàn)證: UI界面 任務(wù)的history–>configuration
Reduce 輸出壓縮的格式:
檢查是否設(shè)置成功:從導(dǎo)入文件中查看文件的格式:
3.7.1.行存儲(chǔ)和列存儲(chǔ)
row layout 表示行存儲(chǔ)
column layout 表示列存儲(chǔ)
Textfile 和sequencefile的存儲(chǔ)格式是基于行存儲(chǔ)的
orc 和parquet 是基于列表存儲(chǔ)的
3.7.2.textfile 格式:
3.7.3.Orc 格式
不是完成的列存儲(chǔ): 是將按照256M 進(jìn)行切分 每個(gè)256 是一個(gè)stripe, stripe 是按照列方式存儲(chǔ),stripe 是按照256M 橫向切分,因此不是完全列存儲(chǔ);
3.7.4.Parquet 存儲(chǔ)格式
parquet 是一個(gè)二進(jìn)制存儲(chǔ)格式: (簡(jiǎn)單看)
3.8.內(nèi)部表/外部表
- 內(nèi)部表
內(nèi)部表數(shù)據(jù)由Hive自身管理,數(shù)據(jù)存儲(chǔ)的位置是hive.metastore.warehouse.dir
刪除內(nèi)部表會(huì)直接刪除元數(shù)據(jù)(metadata)及存儲(chǔ)數(shù)據(jù) - 外部表
外部表數(shù)據(jù)的存儲(chǔ)位置由自己制定,可以在云端
刪除外部表僅僅會(huì)刪除元數(shù)據(jù)
表結(jié)構(gòu)和數(shù)據(jù)都將被保存
CREATE EXTERNAL TABLE
test_table(id STRING,
name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ LOCATION ‘/data/test/test_table’;
– 導(dǎo)入數(shù)據(jù)到表中(文件會(huì)被移動(dòng)到倉(cāng)庫(kù)目錄/data/test/test_table)
LOAD DATA INPATH ‘/test_tmp_data.txt’ INTO TABLE test_table;
3.9.hive元數(shù)據(jù)存儲(chǔ)
Hive中metastore(元數(shù)據(jù)存儲(chǔ))的三種方式:
Hive將元數(shù)據(jù)存儲(chǔ)在RDBMS中,有三種模式可以連接到數(shù)據(jù)庫(kù):
a)內(nèi)嵌Derby方式
b)Local方式
c)Remote方式
單用戶本地模式:
1、元數(shù)據(jù)庫(kù)內(nèi)嵌模式:此模式連接到一個(gè)In-memory 的數(shù)據(jù)庫(kù)Derby,一般用于Unit Test。
多用戶模式:
2、元數(shù)據(jù)庫(kù)mysql模式:通過(guò)網(wǎng)絡(luò)連接到一個(gè)數(shù)據(jù)庫(kù)中,是最經(jīng)常使用到的模式。
多用戶遠(yuǎn)程模式
3、MetaStoreServe訪問(wèn)元數(shù)據(jù)庫(kù)模式:用于非Java客戶端訪問(wèn)元數(shù)據(jù)庫(kù),在服務(wù)器端啟動(dòng)MetaStoreServer,客戶端利用Thrift協(xié)議通過(guò)MetaStoreServer訪問(wèn)元數(shù)據(jù)庫(kù)。
3.10.分區(qū):
就是在系統(tǒng)上建立文件夾,把分類(lèi)數(shù)據(jù)放在不同文件夾下面,加快查詢速度
實(shí)戰(zhàn)
CREATE TABLE
logs(ts BIGINT,
line string) partitioned BY (dt String,
country string) ROW format delimited fields terminated BY ‘\t’;
load DATA LOCAL inpath ‘/Users/Ginger/Downloads/dirtory/doc/7/data/file1’ INTO
TABLE
logs PARTITION (dt = ‘2001-01-01’,
country = ‘GB’);
show partitions logs;
3.11.分桶:
桶是比分區(qū)更細(xì)粒度的劃分:就是說(shuō)分區(qū)的基礎(chǔ)上還還可以進(jìn)行分桶;hive采用對(duì)某一列進(jìn)行分桶的組織;hive采用對(duì)列取hash值,然后再和桶值進(jìn)行取余的方式?jīng)Q定這個(gè)列放到哪個(gè)桶中;
create table if not exists center( id int comment ‘’ ,
user_id int comment ‘’ ,
cts timestamp comment ‘’ ,
uts timestamp comment ‘’ )
comment ‘’
partitioned by (dt string)
clustered by (id) sorted by(cts) into 10 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
stored as textfile ;
3.12 大數(shù)據(jù)應(yīng)用架構(gòu)
3.13 數(shù)據(jù)倉(cāng)庫(kù)架構(gòu)
4.遇到的問(wèn)題;
4.1.Hive sql 執(zhí)行的順序與mysql 對(duì)比:
Map階段:
1.執(zhí)行from加載,進(jìn)行表的查找與加載
2.執(zhí)行where過(guò)濾,進(jìn)行條件過(guò)濾與篩選
3.執(zhí)行select查詢:進(jìn)行輸出項(xiàng)的篩選
4.執(zhí)行g(shù)roup by分組:描述了分組后需要計(jì)算的函數(shù)
5.map端文件合并:map端本地溢出寫(xiě)文件的合并操作,每個(gè)map最終形成一個(gè)臨時(shí)文件。
然后按列映射到對(duì)應(yīng)的reduceReduce階段:
Reduce階段:
1.group by:對(duì)map端發(fā)送過(guò)來(lái)的數(shù)據(jù)進(jìn)行分組并進(jìn)行計(jì)算。
2.select:最后過(guò)濾列用于輸出結(jié)果
3.limit排序后進(jìn)行結(jié)果輸出到HDFS文件
FROM … WHERE … SELECT … GROUP BY … HAVING … ORDER BY …
4.1.1 sql 執(zhí)行順序
參考的博客
- sql語(yǔ)句 執(zhí)行順序 拆分
參考博客
4.2.Hive update 需要表設(shè)置
由于涉及到存儲(chǔ)過(guò)程改造,需要更新操作,因此需要開(kāi)啟update 特性
參考博客
Hive 開(kāi)啟insert update 配置
Shell 開(kāi)啟:
Update is allowed for ORC file formats only. Also you have to set few properties before performing the update or delete.
Client Side
set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
Server Side (Metastore)
set hive.compactor.initiator.on=true;
set hive.compactor.worker.threads=1;
After setting this create the table with required properties
CREATE TABLE test_result
(run_id VARCHAR(100), chnl_txt_map_key INT)
clustered by (run_id) into 1 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
STORED AS orc tblproperties (“transactional”=“true” );
注意!Hive3.1.2 需要配置hive-site.xml
只是創(chuàng)建時(shí)指定"transactional"=“true” 是不能執(zhí)行insert 和update
參考博客
4.3.Hive腳本中設(shè)置變量
由于存儲(chǔ)過(guò)程中涉及到變量,兩種方式,一種采用shell 方式,一種采用 hive 提供的設(shè)置變量的方式
參考博客
4.7批量更新
存儲(chǔ)過(guò)程改造過(guò)程,涉及到批量更新的操作,改造過(guò)程中遇到,批量更新的問(wèn)題,幸運(yùn)的是hive 2.2 已經(jīng)支持了批量更新的特性
hive2.2 支持merge into 功能實(shí)現(xiàn)和mysql批量update 功能 類(lèi)似的功能
- hive2.2.0及之后的版本支持使用merge into 語(yǔ)法,使用源表數(shù)據(jù)批量更新目標(biāo)表的數(shù)據(jù)。使用該功能還需做如下配置
1、參數(shù)配置
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1;
set hive.auto.convert.join=false;
set hive.merge.cardinality.check=false; – 目標(biāo)表中出現(xiàn)重復(fù)匹配時(shí)要設(shè)置該參數(shù)才行
2、建表要求
Hive對(duì)使用Update功能的表有特定的語(yǔ)法要求, 語(yǔ)法要求如下:
(1)要執(zhí)行Update的表中, 建表時(shí)必須帶有buckets(分桶)屬性
(2)要執(zhí)行Update的表中, 需要指定格式,其余格式目前贊不支持, 如:parquet格式, 目前只支持ORCFileformat和AcidOutputFormat
(3)要執(zhí)行Update的表中, 建表時(shí)必須指定參數(shù)(‘transactional’ = true);
4.71 批量更新語(yǔ)法
MERGE INTO AS T USING <source expression/table> AS S
ON <boolean` `expression1> WHEN MATCHED [AND <booleanexpression2>] THEN UPDATE SET
WHEN MATCHED [AND <boolean` `expression3>] THEN DELETE WHEN NOT MATCHED [AND <booleanexpression4>] THEN INSERT VALUES
Example
CREATE DATABASE merge_data;
CREATE TABLE merge_data.transactions(
ID int,
TranValue string,
last_update_user string)
PARTITIONED BY (tran_date string)
CLUSTERED BY (ID) into 5 buckets
STORED AS ORC TBLPROPERTIES (‘transactional’=‘true’);
CREATE TABLE merge_data.merge_source(
ID int,
TranValue string,
tran_date string)
STORED AS ORC;
INSERT INTO merge_data.transactions PARTITION (tran_date) VALUES
(1, ‘value_01’, ‘creation’, ‘20170410’),
(2, ‘value_02’, ‘creation’, ‘20170410’),
(3, ‘value_03’, ‘creation’, ‘20170410’),
(4, ‘value_04’, ‘creation’, ‘20170410’),
(5, ‘value_05’, ‘creation’, ‘20170413’),
(6, ‘value_06’, ‘creation’, ‘20170413’),
(7, ‘value_07’, ‘creation’, ‘20170413’),
(8, ‘value_08’, ‘creation’, ‘20170413’),
(9, ‘value_09’, ‘creation’, ‘20170413’),
(10, ‘value_10’,‘creation’, ‘20170413’);
INSERT INTO merge_data.merge_source VALUES
(1, ‘value_01’, ‘20170410’),
(4, NULL, ‘20170410’),
(7, ‘value_77777’, ‘20170413’),
(8, NULL, ‘20170413’),
(8, ‘value_08’, ‘20170415’),
(11, ‘value_11’, ‘20170415’);
注意執(zhí)行 merge into 前設(shè)置:set hive.auto.convert.join=false; 否則報(bào):ERROR [main] mr.MapredLocalTask: Hive Runtime Error: Map local work failed
注意! update set 語(yǔ)句后面的 字段不用加表別名否則會(huì)報(bào)錯(cuò)
示例:SET TranValue = S.TranValue
MERGE INTO merge_data.transactions AS T
USING merge_data.merge_source AS S
ON T.ID = S.ID and T.tran_date = S.tran_date
WHEN MATCHED AND (T.TranValue != S.TranValue AND S.TranValue IS NOT NULL) THEN UPDATE SET TranValue = S.TranValue, last_update_user = ‘merge_update’
WHEN MATCHED AND S.TranValue IS NULL THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (S.ID, S.TranValue, ‘merge_insert’, S.tran_date);
參考博客1
參考博客2
4.5 函數(shù)
desc function upper;
Desc function extended upper;
4.6.Hive 自定義udf 函數(shù)
公司中一般寫(xiě)UDF比較多:utdf ,
參考的網(wǎng)址:
4.6.1 臨時(shí)函數(shù)
4.6.2 永久函數(shù)
創(chuàng)建永久函數(shù):
hadoop fs -mkdir /lib
hdfs dfs -put /home/hadoop/jar/add_months-1.0-SNAPSHOT.jar /lib
CREATE FUNCTION user_info.add_month AS “com.hivefunction.AddMonths” USING JAR “hdfs://localhost:9000/lib/add_months-1.0-SNAPSHOT.jar”;
參考博客1
參考博客2
4.7.Hive 優(yōu)化:
參考博客1
4.7.1.Fetch 抓取
Config.xml配置
4.7.2.本地模式:
默認(rèn)是提交到y(tǒng)arn 上進(jìn)行執(zhí)行
測(cè)試環(huán)境,可以設(shè)置為本地模式更快;
4.7.3.大表join 小表 mapjoin設(shè)置
過(guò)濾掉空key
為了防止數(shù)據(jù)傾斜:可以給null 賦一個(gè)隨機(jī)值,
Set mapreduce.job.reduces=5 設(shè)置5個(gè)reduce 注意!UI 查看reduces 時(shí)間,從applicationId -->history—>reducer查看每個(gè)reducer 執(zhí)行從時(shí)間
4.7.4.Mapjoin
Set hive.mapjoin.smalltable.filesize=256000000 設(shè)置小表的大小,依據(jù)機(jī)器內(nèi)存大小設(shè)置
4.7.5.Group by 優(yōu)化
設(shè)置map進(jìn)行聚合:
Combatiner 聚合: hive.map.aggr =true; 注意!添加combatiner組件操作,結(jié)果(業(yè)務(wù)邏輯不會(huì)變)不會(huì)變時(shí)使用
Hive.group by.skewindata=true ;
4.7.6.Count(distinct) 去重統(tǒng)計(jì)
Count(disticnt) distinct 是在一個(gè)reduce 處理,會(huì)出現(xiàn)數(shù)據(jù)傾斜的情況
Select count(distinct id) from bigtable 會(huì)看到 map處理完的數(shù)據(jù)放在一個(gè)reduce 中進(jìn)行處理;注意!count(id) 最終會(huì)放到一個(gè)reduce中執(zhí)行;
優(yōu)化: 先group by 然后在統(tǒng)計(jì):
Select count(id) from (select id from bigtable group by id) a;
4.7.7.笛卡爾積:
4.7.8.行列過(guò)濾
謂詞下推:先過(guò)濾 通過(guò)子查詢?nèi)缓笤陉P(guān)聯(lián)表
4.7.9.動(dòng)態(tài)分區(qū)
其實(shí)是依據(jù)表中的一個(gè)字段作為動(dòng)態(tài)分區(qū)的字段
每個(gè)Mr默認(rèn)設(shè)置分區(qū)是1000
首先是將數(shù)據(jù)導(dǎo)入到靜態(tài)分區(qū),然后在導(dǎo)入的動(dòng)態(tài)分區(qū)中去:
實(shí)例入下圖
總結(jié):分區(qū),分桶,是避免加載數(shù)據(jù)量過(guò)大;
4.7.10.數(shù)據(jù)傾斜
Map 數(shù)量設(shè)置
當(dāng)小文件過(guò)多時(shí),合并小文件
當(dāng)文件大小一定時(shí),字段就兩三個(gè),這樣記錄上億條,需要降低 split.maxsize 增加map的數(shù)量;注意!看下面的公式;
當(dāng)小文件過(guò)多時(shí),合并小文件
當(dāng)文件大小一定時(shí),字段就兩三個(gè),這樣記錄上億條,需要降低 split.maxsize 增加map的數(shù)量;注意!看下面的公式;
4.7.10.1.小文件合并:
4.7.10.2.復(fù)雜文件增加Map數(shù)量
當(dāng)設(shè)置 map,reduce數(shù)量是-1時(shí)系統(tǒng)才會(huì)自動(dòng)根據(jù)設(shè)置分片的大小進(jìn)行動(dòng)態(tài)切片
4.7.10.3.設(shè)置reduce的數(shù)量
4.7.10.4.并行執(zhí)行
多個(gè)階段執(zhí)行 并且沒(méi)有依賴時(shí)打開(kāi):(hive中某幾個(gè)階段沒(méi)有依賴)
4.7.10.5.Hive 嚴(yán)格模式
生產(chǎn)環(huán)境:肯定是嚴(yán)格模式
嚴(yán)格模式下,一些不允許的操作:
笛卡爾積是不允許的
分區(qū)表查詢,必須帶分區(qū)
Order by 時(shí)必須帶limit
4.7.10.6.Jvm重用
可以在程序中手動(dòng)設(shè)置: set mapreduce.job.jvm.numtasks=10;
或者在xml 文件中配置;
注意!Jvm 重用是針對(duì)同一個(gè)job中不同task的jvm重用;
4.7.10.7.推測(cè)執(zhí)行
默認(rèn)是開(kāi)啟的;
4.7.10.8.壓縮見(jiàn)hive格式
4.7.10.9.explain
5.Sqoop語(yǔ)句如下:
hive 與mysql 數(shù)據(jù)類(lèi)型映射關(guān)系
sqoop 命令詳解參考博客
總結(jié) mysql 中的double 有保留值例如double(10,7) 映射成hive 處理為decimal(10,7) 在數(shù)值計(jì)算過(guò)程中,計(jì)算結(jié)果和存儲(chǔ)過(guò)程計(jì)算結(jié)果沒(méi)有出入;
6.Hive 高級(jí)函數(shù):
Over 一般跟在聚合函數(shù)的后面,指定窗口的大小
Select name,count(*) over() from business where subString(orderdate,1,7)=”2017-04”
group by name ;
Group by name 后over() 函數(shù)依據(jù)的是分組后的兩行進(jìn)行計(jì)算;
7 常見(jiàn)的面試題
7.1.Left semi join 和left join 的區(qū)別
LEFT SEMI JOIN (左半連接)是 IN/EXISTS 子查詢的一種更高效的實(shí)現(xiàn)
Left semi join 相當(dāng)于 in(keyset) 遇到右表重復(fù)記錄,會(huì)跳過(guò),而join是一直遍歷,join會(huì)出現(xiàn)重復(fù)結(jié)果;
參考博客1
7.2.數(shù)據(jù)庫(kù)拉鏈表
記錄一個(gè)食物從開(kāi)始一直到當(dāng)前狀態(tài)所有的狀態(tài)的信息;
適應(yīng)場(chǎng)景:
數(shù)據(jù)模型設(shè)計(jì)中遇到如下問(wèn)題: 適用拉鏈表
例如一張流水表: ods_account
? Hive 上一張流水記錄表 ods_account_his
? 采用批量增加改變的添加到 ods_account_his
- 拉鏈表的邏輯設(shè)計(jì)
接下來(lái)通過(guò)一個(gè)實(shí)例來(lái)簡(jiǎn)述一下應(yīng)該如何設(shè)計(jì)拉鏈表
首先,針對(duì)于某賬戶信息表,在2018年1月1日的信息如下表(為了簡(jiǎn)化設(shè)計(jì),這里增加了信息變更時(shí)間UPDATE_DATE):
UPDATE_DATE):
由此表我們可以得到以下拉鏈表,開(kāi)始時(shí)間和結(jié)束時(shí)間表示數(shù)據(jù)的生命周期,結(jié)束時(shí)間9999-99-99表示此條數(shù)據(jù)為當(dāng)前時(shí)間的數(shù)據(jù):
接下來(lái),在2018年1月2日做數(shù)據(jù)采集時(shí),采集到了UPDATE_DATE為2018-01-02的以下數(shù)據(jù):
通過(guò)兩個(gè)表的對(duì)比可以得出,對(duì)于同一個(gè)賬戶ID來(lái)說(shuō),1號(hào)賬戶的賬戶余額發(fā)生變更變成了600,2號(hào)賬戶的余額發(fā)生變更變成了100,則我們可以根據(jù)這張表和上面的拉鏈表關(guān)聯(lián),得到新的拉鏈表:
以此類(lèi)推,我們可以查詢到2018年1月1日之后的所有生命周期的數(shù)據(jù),例如:
o查詢當(dāng)前所有有效記錄: SELECT * FROM ACCOUNT_HIST WHERE END_DATE = ‘9999-99-99’
o查詢2018年1月1日的歷史快照:SELECT * FROM ACCOUNT_HIST WHERE START_DATE <= ‘2018-01-01’ AND END_DATE >= ‘2018-01-01’
參考博客1
7.3 抽取數(shù)據(jù)庫(kù)中存在json數(shù)據(jù)怎么處理
推薦處理的函數(shù) get_json_object 、 json_tuple、 regexp_replace
7.4 求日環(huán)比和月環(huán)比
7.5 數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)集市
數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)集市解釋
8. hadoop-yarn 參數(shù)調(diào)優(yōu)
例1:
假設(shè)一臺(tái)服務(wù)器,內(nèi)存128G,16個(gè)pcore,需要安裝DataNode和NodeManager,
具體如何設(shè)置參數(shù)?
1)裝完CentOS,消耗內(nèi)存1G;
2)系統(tǒng)預(yù)留15%-20%(包含第1點(diǎn)),防止全部使用二導(dǎo)致系統(tǒng)夯住或者OOM機(jī)制事件,
或者給未來(lái)部署其他組件預(yù)留空間。此時(shí)余下12880%=102G
3)DataNode設(shè)定2G,NodeManager設(shè)定4G,則剩余102-2-4=96G;
4)明確兩點(diǎn):pcore:vcore=1:2 ,故vcore數(shù)量為162=32;單個(gè)container占用4個(gè)vcore
5)確定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32個(gè)container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8個(gè)container
yarn.nodemanager.resource.memory-mb --> 96G # RM能使用的最大內(nèi)存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 極限8個(gè)(96/8)
注意:若有spark組件,當(dāng)spark計(jì)算時(shí)內(nèi)存不夠大,
yarn.scheduler.maximum-allocation-mb勢(shì)必要調(diào)大,
則這種理想化的設(shè)置會(huì)被打破,以memory為主
yarn參數(shù)調(diào)優(yōu)參考博客
總結(jié)
以上是生活随笔為你收集整理的hive工作中分享总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软考论文写作攻略,让你轻松拿高分!
- 下一篇: Vivado 2019.1 使用教程