hive工作中分享总结
hive分享總結(jié)
- 1. 數(shù)據(jù)家譜:
- 1.1.Hive 是什么?
- 1.2.數(shù)據(jù)倉庫
- 1.3.Hive與傳統(tǒng)數(shù)據(jù)庫的區(qū)別
- 1.4.Hive的優(yōu)缺點
- 1.5.Hive使用場景
- 1.6.Hdfs 運行機制
- 1.7.Mapreduce 運行機制
- 1.8.SQL轉(zhuǎn)化成MapReduce過程
- 1.9.Hive 架構(gòu):
- 2.Hive交互方式
- 2.1.Hive交互shell
- 2.2.JDBC交互
- 2.3.第三種交互方式:
- 3.Hive 基礎(chǔ)
- 3.1.hive 支持的基本類型
- 3.2.基本SQL語句
- 3.3.排序
- 3.4.行轉(zhuǎn)列
- 3.5.列轉(zhuǎn)行
- 3.6.hive 內(nèi)連接外連接
- 3.7.Hive 存儲格式
- 3.7.1.行存儲和列存儲
- 3.7.2.textfile 格式:
- 3.7.3.Orc 格式
- 3.7.4.Parquet 存儲格式
- 3.8.內(nèi)部表/外部表
- 3.9.hive元數(shù)據(jù)存儲
- 3.10.分區(qū):
- 3.11.分桶:
- 3.12 大數(shù)據(jù)應(yīng)用架構(gòu)
- 3.13 數(shù)據(jù)倉庫架構(gòu)
- 4.遇到的問題;
- 4.1.Hive sql 執(zhí)行的順序與mysql 對比:
- 4.1.1 sql 執(zhí)行順序
- 4.2.Hive update 需要表設(shè)置
- 4.3.Hive腳本中設(shè)置變量
- 4.7批量更新
- 4.71 批量更新語法
- 4.5 函數(shù)
- 4.6.Hive 自定義udf 函數(shù)
- 4.6.1 臨時函數(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)計
- 4.7.7.笛卡爾積:
- 4.7.8.行列過濾
- 4.7.9.動態(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.推測執(zhí)行
- 4.7.10.8.壓縮見hive格式
- 4.7.10.9.explain
- 5.Sqoop語句如下:
- 6.Hive 高級函數(shù):
- 7 常見的面試題
- 7.1.Left semi join 和left join 的區(qū)別
- 7.2.數(shù)據(jù)庫拉鏈表
- 7.3 抽取數(shù)據(jù)庫中存在json數(shù)據(jù)怎么處理
- 7.4 求日環(huán)比和月環(huán)比
- 7.5 數(shù)據(jù)倉庫和數(shù)據(jù)集市
- 8. hadoop-yarn 參數(shù)調(diào)優(yōu)
很抱歉最近找房子,hive 分享一直想更新,一直被耽擱
工作中設(shè)計到數(shù)倉的建設(shè),還有存儲過程到hive 腳本的改造 目前只能整理到第四章
1. 數(shù)據(jù)家譜:
- 關(guān)系型數(shù)據(jù)庫
- 非關(guān)系型數(shù)據(jù)庫
- 數(shù)據(jù)倉庫
1.1.Hive 是什么?
? ?Hive 是一個類SQL 能夠操作hdfs 數(shù)據(jù)的數(shù)據(jù)倉庫基礎(chǔ)架構(gòu)
Hive 是一個SQL 的解析引擎,能夠?qū)SQL翻譯MR在hadoop 中執(zhí)行。
hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行。 其優(yōu)點是學(xué)習(xí)成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。
總結(jié):
Hive 是一個類SQL 能夠操作hdfs 數(shù)據(jù)的數(shù)據(jù)倉庫基礎(chǔ)架構(gòu)
Hive 是一個SQL 的解析引擎,能夠?qū)SQL翻譯MR在hadoop 中執(zhí)行。
1.2.數(shù)據(jù)倉庫
??數(shù)據(jù)倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH。數(shù)據(jù)倉庫,是為企業(yè)所有級別的決策制定過程,提供所有類型數(shù)據(jù)支持的戰(zhàn)略集合。它是單個數(shù)據(jù)存儲,出于分析性報告和決策支持目的而創(chuàng)建。 為需要業(yè)務(wù)智能的企業(yè),提供指導(dǎo)業(yè)務(wù)流程改進、監(jiān)視時間、成本、質(zhì)量以及控制,簡而言之,數(shù)據(jù)倉庫是用來做查詢分析的數(shù)據(jù)庫,基本不用來做插入,修改,刪除;
1.3.Hive與傳統(tǒng)數(shù)據(jù)庫的區(qū)別
注意hive讀時模式:Hive在加載數(shù)據(jù)到表中的時候不會校驗.
(備注 讀模式
數(shù)據(jù)被加載到數(shù)據(jù)庫的時候,不對其合法性進行校驗,只在查詢等操作的時候進行校驗,特點:加載速度快,適合大數(shù)據(jù)的加載
寫模式
數(shù)據(jù)被加載到數(shù)據(jù)庫的時候,需對其合法性進行校驗,數(shù)據(jù)庫中的數(shù)據(jù)都是合法的數(shù)據(jù),特點:加載速度慢,但是查詢速度快。)
寫時模式:Mysql數(shù)據(jù)庫插入數(shù)據(jù)到表的時候會進行校驗.
總結(jié):Hive只適合用來做海量離線的數(shù)據(jù)統(tǒng)計分析,也就是數(shù)據(jù)倉庫。
1.4.Hive的優(yōu)缺點
?? 優(yōu)點:操作接口采用了類SQL語法,提供快速開發(fā)的能力,避免了去寫MapReduce;Hive還支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求實現(xiàn)自己的函數(shù)。
缺點:Hive查詢延遲很嚴(yán)重。
1.5.Hive使用場景
- 數(shù)據(jù)的離線處理;比如:日志分析,海量結(jié)構(gòu)化數(shù)據(jù)離線分析…
- Hive的執(zhí)行延遲比較高,因此hive常用于數(shù)據(jù)分析的,對實時性要求不高的場合;
- Hive優(yōu)勢在于處理大數(shù)據(jù),對于處理小數(shù)據(jù)沒有優(yōu)勢,因為Hive的執(zhí)行延遲比較高。
1.6.Hdfs 運行機制
https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html
1.7.Mapreduce 運行機制
參考博客1
參考博客2
1.8.SQL轉(zhuǎn)化成MapReduce過程
- Hive是如何將SQL轉(zhuǎn)化為MapReduce任務(wù)的,整個編譯過程分為六個階段:
- 1-Antlr定義SQL的語法規(guī)則,完成SQL詞法,語法解析,將SQL轉(zhuǎn)化為抽象語法樹AST Tree;
- 2-遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
- 3-遍歷QueryBlock,翻譯為執(zhí)行操作樹OperatorTree;
- 4-邏輯層優(yōu)化器進行OperatorTree變換,合并不必要的ReduceSinkOperator,減少shuffle數(shù)據(jù)量;
- 5-遍歷OperatorTree,翻譯為MapReduce任務(wù);
- 6-物理層優(yōu)化器進行MapReduce任務(wù)的變換,生成最終的執(zhí)行計劃。
1.9.Hive 架構(gòu):
(1) 用戶接口:CLI(hive shell);JDBC(java訪問Hive);WEBUI(瀏覽器訪問Hive)
? (2)元數(shù)據(jù):MetaStore
元數(shù)據(jù)包括:表名、表所屬的數(shù)據(jù)庫(默認是default)、表的擁有者、列/分區(qū)字段,標(biāo)的類型(表是否為外部表)、表的數(shù)據(jù)所在目錄。這是數(shù)據(jù)默認存儲在Hive自帶的derby數(shù)據(jù)庫中,推薦使用MySQL數(shù)據(jù)庫存儲MetaStore。
(3)Hive使用HDFS存儲數(shù)據(jù)(.Hadoop集群):
使用HDFS進行存儲數(shù)據(jù),使用MapReduce進行計算。
(4)Driver:驅(qū)動器
解析器(SQL Parser):將SQL字符串換成抽象語法樹AST,對AST進行語法分析,像是表是否存在、字段是否存在、SQL語義是否有誤。
編譯器(Physical Plan):將AST編譯成邏輯執(zhí)行計劃。
優(yōu)化器(Query Optimizer):將邏輯計劃進行優(yōu)化。
執(zhí)行器(Execution):把執(zhí)行計劃轉(zhuǎn)換成可以運行的物理計劃。對于Hive來說默認就是Mapreduce任務(wù)。
2.Hive交互方式
2.1.Hive交互shell
./hive 命令方式
bin/hive
2.2.JDBC交互
輸入hiveserver2相當(dāng)于開啟了一個服務(wù)端,查看hivesever2的轉(zhuǎn)態(tài)
輸入netstat –nlp命令查看:
運行hiveserver2相當(dāng)于開啟了一個服務(wù)端,端口號10000,需要開啟一個客戶端進行通信,所以打開另一個窗口,輸入命令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語句或者sql腳本進行交互
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 支持的基本類型
3.2.基本SQL語句
insert、delete、update、select
多表查詢與代數(shù)運算
內(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 全局排序,只有一個reducer
Sort by 每個reducer 內(nèi)部配置 需要設(shè)置reducer 個數(shù):
Distribute by
Cluster by 只能升序排序:
3.4.行轉(zhuǎn)列
3.5.列轉(zhuǎn)行
排序函數(shù)
Rank() 對應(yīng)下圖 rand_window_0
Dense_rank() 對應(yīng)下圖_ dense_rank_window_1
Row_number() 對應(yīng)下圖 row_number_window_2
3.6.hive 內(nèi)連接外連接
多表查詢與代數(shù)運算
內(nèi)連接:
外鏈接
右連接:
3.7.Hive 存儲格式
自定義編譯(練習(xí))
Hive 查看存儲格式:
hadoop checknative
Snappy 得添加snappy 的jar 重新編譯hadoop.jar
Map 設(shè)置壓縮方式:
驗證: UI界面 任務(wù)的history–>configuration
Reduce 輸出壓縮的格式:
檢查是否設(shè)置成功:從導(dǎo)入文件中查看文件的格式:
3.7.1.行存儲和列存儲
row layout 表示行存儲
column layout 表示列存儲
Textfile 和sequencefile的存儲格式是基于行存儲的
orc 和parquet 是基于列表存儲的
3.7.2.textfile 格式:
3.7.3.Orc 格式
不是完成的列存儲: 是將按照256M 進行切分 每個256 是一個stripe, stripe 是按照列方式存儲,stripe 是按照256M 橫向切分,因此不是完全列存儲;
3.7.4.Parquet 存儲格式
parquet 是一個二進制存儲格式: (簡單看)
3.8.內(nèi)部表/外部表
- 內(nèi)部表
內(nèi)部表數(shù)據(jù)由Hive自身管理,數(shù)據(jù)存儲的位置是hive.metastore.warehouse.dir
刪除內(nèi)部表會直接刪除元數(shù)據(jù)(metadata)及存儲數(shù)據(jù) - 外部表
外部表數(shù)據(jù)的存儲位置由自己制定,可以在云端
刪除外部表僅僅會刪除元數(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ù)到表中(文件會被移動到倉庫目錄/data/test/test_table)
LOAD DATA INPATH ‘/test_tmp_data.txt’ INTO TABLE test_table;
3.9.hive元數(shù)據(jù)存儲
Hive中metastore(元數(shù)據(jù)存儲)的三種方式:
Hive將元數(shù)據(jù)存儲在RDBMS中,有三種模式可以連接到數(shù)據(jù)庫:
a)內(nèi)嵌Derby方式
b)Local方式
c)Remote方式
單用戶本地模式:
1、元數(shù)據(jù)庫內(nèi)嵌模式:此模式連接到一個In-memory 的數(shù)據(jù)庫Derby,一般用于Unit Test。
多用戶模式:
2、元數(shù)據(jù)庫mysql模式:通過網(wǎng)絡(luò)連接到一個數(shù)據(jù)庫中,是最經(jīng)常使用到的模式。
多用戶遠程模式
3、MetaStoreServe訪問元數(shù)據(jù)庫模式:用于非Java客戶端訪問元數(shù)據(jù)庫,在服務(wù)器端啟動MetaStoreServer,客戶端利用Thrift協(xié)議通過MetaStoreServer訪問元數(shù)據(jù)庫。
3.10.分區(qū):
就是在系統(tǒng)上建立文件夾,把分類數(shù)據(jù)放在不同文件夾下面,加快查詢速度
實戰(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ū)更細粒度的劃分:就是說分區(qū)的基礎(chǔ)上還還可以進行分桶;hive采用對某一列進行分桶的組織;hive采用對列取hash值,然后再和桶值進行取余的方式?jīng)Q定這個列放到哪個桶中;
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ù)倉庫架構(gòu)
4.遇到的問題;
4.1.Hive sql 執(zhí)行的順序與mysql 對比:
Map階段:
1.執(zhí)行from加載,進行表的查找與加載
2.執(zhí)行where過濾,進行條件過濾與篩選
3.執(zhí)行select查詢:進行輸出項的篩選
4.執(zhí)行g(shù)roup by分組:描述了分組后需要計算的函數(shù)
5.map端文件合并:map端本地溢出寫文件的合并操作,每個map最終形成一個臨時文件。
然后按列映射到對應(yīng)的reduceReduce階段:
Reduce階段:
1.group by:對map端發(fā)送過來的數(shù)據(jù)進行分組并進行計算。
2.select:最后過濾列用于輸出結(jié)果
3.limit排序后進行結(jié)果輸出到HDFS文件
FROM … WHERE … SELECT … GROUP BY … HAVING … ORDER BY …
4.1.1 sql 執(zhí)行順序
參考的博客
- sql語句 執(zhí)行順序 拆分
參考博客
4.2.Hive update 需要表設(shè)置
由于涉及到存儲過程改造,需要更新操作,因此需要開啟update 特性
參考博客
Hive 開啟insert update 配置
Shell 開啟:
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)建時指定"transactional"=“true” 是不能執(zhí)行insert 和update
參考博客
4.3.Hive腳本中設(shè)置變量
由于存儲過程中涉及到變量,兩種方式,一種采用shell 方式,一種采用 hive 提供的設(shè)置變量的方式
參考博客
4.7批量更新
存儲過程改造過程,涉及到批量更新的操作,改造過程中遇到,批量更新的問題,幸運的是hive 2.2 已經(jīng)支持了批量更新的特性
hive2.2 支持merge into 功能實現(xiàn)和mysql批量update 功能 類似的功能
- hive2.2.0及之后的版本支持使用merge into 語法,使用源表數(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ù)才行
2、建表要求
Hive對使用Update功能的表有特定的語法要求, 語法要求如下:
(1)要執(zhí)行Update的表中, 建表時必須帶有buckets(分桶)屬性
(2)要執(zhí)行Update的表中, 需要指定格式,其余格式目前贊不支持, 如:parquet格式, 目前只支持ORCFileformat和AcidOutputFormat
(3)要執(zhí)行Update的表中, 建表時必須指定參數(shù)(‘transactional’ = true);
4.71 批量更新語法
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; 否則報:ERROR [main] mr.MapredLocalTask: Hive Runtime Error: Map local work failed
注意! update set 語句后面的 字段不用加表別名否則會報錯
示例: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ù)
公司中一般寫UDF比較多:utdf ,
參考的網(wǎng)址:
4.6.1 臨時函數(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.本地模式:
默認是提交到y(tǒng)arn 上進行執(zhí)行
測試環(huán)境,可以設(shè)置為本地模式更快;
4.7.3.大表join 小表 mapjoin設(shè)置
過濾掉空key
為了防止數(shù)據(jù)傾斜:可以給null 賦一個隨機值,
Set mapreduce.job.reduces=5 設(shè)置5個reduce 注意!UI 查看reduces 時間,從applicationId -->history—>reducer查看每個reducer 執(zhí)行從時間
4.7.4.Mapjoin
Set hive.mapjoin.smalltable.filesize=256000000 設(shè)置小表的大小,依據(jù)機器內(nèi)存大小設(shè)置
4.7.5.Group by 優(yōu)化
設(shè)置map進行聚合:
Combatiner 聚合: hive.map.aggr =true; 注意!添加combatiner組件操作,結(jié)果(業(yè)務(wù)邏輯不會變)不會變時使用
Hive.group by.skewindata=true ;
4.7.6.Count(distinct) 去重統(tǒng)計
Count(disticnt) distinct 是在一個reduce 處理,會出現(xiàn)數(shù)據(jù)傾斜的情況
Select count(distinct id) from bigtable 會看到 map處理完的數(shù)據(jù)放在一個reduce 中進行處理;注意!count(id) 最終會放到一個reduce中執(zhí)行;
優(yōu)化: 先group by 然后在統(tǒng)計:
Select count(id) from (select id from bigtable group by id) a;
4.7.7.笛卡爾積:
4.7.8.行列過濾
謂詞下推:先過濾 通過子查詢?nèi)缓笤陉P(guān)聯(lián)表
4.7.9.動態(tài)分區(qū)
其實是依據(jù)表中的一個字段作為動態(tài)分區(qū)的字段
每個Mr默認設(shè)置分區(qū)是1000
首先是將數(shù)據(jù)導(dǎo)入到靜態(tài)分區(qū),然后在導(dǎo)入的動態(tài)分區(qū)中去:
實例入下圖
總結(jié):分區(qū),分桶,是避免加載數(shù)據(jù)量過大;
4.7.10.數(shù)據(jù)傾斜
Map 數(shù)量設(shè)置
當(dāng)小文件過多時,合并小文件
當(dāng)文件大小一定時,字段就兩三個,這樣記錄上億條,需要降低 split.maxsize 增加map的數(shù)量;注意!看下面的公式;
當(dāng)小文件過多時,合并小文件
當(dāng)文件大小一定時,字段就兩三個,這樣記錄上億條,需要降低 split.maxsize 增加map的數(shù)量;注意!看下面的公式;
4.7.10.1.小文件合并:
4.7.10.2.復(fù)雜文件增加Map數(shù)量
當(dāng)設(shè)置 map,reduce數(shù)量是-1時系統(tǒng)才會自動根據(jù)設(shè)置分片的大小進行動態(tài)切片
4.7.10.3.設(shè)置reduce的數(shù)量
4.7.10.4.并行執(zhí)行
多個階段執(zhí)行 并且沒有依賴時打開:(hive中某幾個階段沒有依賴)
4.7.10.5.Hive 嚴(yán)格模式
生產(chǎn)環(huán)境:肯定是嚴(yán)格模式
嚴(yán)格模式下,一些不允許的操作:
笛卡爾積是不允許的
分區(qū)表查詢,必須帶分區(qū)
Order by 時必須帶limit
4.7.10.6.Jvm重用
可以在程序中手動設(shè)置: set mapreduce.job.jvm.numtasks=10;
或者在xml 文件中配置;
注意!Jvm 重用是針對同一個job中不同task的jvm重用;
4.7.10.7.推測執(zhí)行
默認是開啟的;
4.7.10.8.壓縮見hive格式
4.7.10.9.explain
5.Sqoop語句如下:
hive 與mysql 數(shù)據(jù)類型映射關(guān)系
sqoop 命令詳解參考博客
總結(jié) mysql 中的double 有保留值例如double(10,7) 映射成hive 處理為decimal(10,7) 在數(shù)值計算過程中,計算結(jié)果和存儲過程計算結(jié)果沒有出入;
6.Hive 高級函數(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ù)的是分組后的兩行進行計算;
7 常見的面試題
7.1.Left semi join 和left join 的區(qū)別
LEFT SEMI JOIN (左半連接)是 IN/EXISTS 子查詢的一種更高效的實現(xiàn)
Left semi join 相當(dāng)于 in(keyset) 遇到右表重復(fù)記錄,會跳過,而join是一直遍歷,join會出現(xiàn)重復(fù)結(jié)果;
參考博客1
7.2.數(shù)據(jù)庫拉鏈表
記錄一個食物從開始一直到當(dāng)前狀態(tài)所有的狀態(tài)的信息;
適應(yīng)場景:
數(shù)據(jù)模型設(shè)計中遇到如下問題: 適用拉鏈表
例如一張流水表: ods_account
? Hive 上一張流水記錄表 ods_account_his
? 采用批量增加改變的添加到 ods_account_his
- 拉鏈表的邏輯設(shè)計
接下來通過一個實例來簡述一下應(yīng)該如何設(shè)計拉鏈表
首先,針對于某賬戶信息表,在2018年1月1日的信息如下表(為了簡化設(shè)計,這里增加了信息變更時間UPDATE_DATE):
UPDATE_DATE):
由此表我們可以得到以下拉鏈表,開始時間和結(jié)束時間表示數(shù)據(jù)的生命周期,結(jié)束時間9999-99-99表示此條數(shù)據(jù)為當(dāng)前時間的數(shù)據(jù):
接下來,在2018年1月2日做數(shù)據(jù)采集時,采集到了UPDATE_DATE為2018-01-02的以下數(shù)據(jù):
通過兩個表的對比可以得出,對于同一個賬戶ID來說,1號賬戶的賬戶余額發(fā)生變更變成了600,2號賬戶的余額發(fā)生變更變成了100,則我們可以根據(jù)這張表和上面的拉鏈表關(guān)聯(lián),得到新的拉鏈表:
以此類推,我們可以查詢到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ù)庫中存在json數(shù)據(jù)怎么處理
推薦處理的函數(shù) get_json_object 、 json_tuple、 regexp_replace
7.4 求日環(huán)比和月環(huán)比
7.5 數(shù)據(jù)倉庫和數(shù)據(jù)集市
數(shù)據(jù)倉庫和數(shù)據(jù)集市解釋
8. hadoop-yarn 參數(shù)調(diào)優(yōu)
例1:
假設(shè)一臺服務(wù)器,內(nèi)存128G,16個pcore,需要安裝DataNode和NodeManager,
具體如何設(shè)置參數(shù)?
1)裝完CentOS,消耗內(nèi)存1G;
2)系統(tǒng)預(yù)留15%-20%(包含第1點),防止全部使用二導(dǎo)致系統(tǒng)夯住或者OOM機制事件,
或者給未來部署其他組件預(yù)留空間。此時余下12880%=102G
3)DataNode設(shè)定2G,NodeManager設(shè)定4G,則剩余102-2-4=96G;
4)明確兩點:pcore:vcore=1:2 ,故vcore數(shù)量為162=32;單個container占用4個vcore
5)確定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32個container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8個container
yarn.nodemanager.resource.memory-mb --> 96G # RM能使用的最大內(nèi)存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 極限8個(96/8)
注意:若有spark組件,當(dāng)spark計算時內(nèi)存不夠大,
yarn.scheduler.maximum-allocation-mb勢必要調(diào)大,
則這種理想化的設(shè)置會被打破,以memory為主
yarn參數(shù)調(diào)優(yōu)參考博客
總結(jié)
以上是生活随笔為你收集整理的hive工作中分享总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考论文写作攻略,让你轻松拿高分!
- 下一篇: Vivado 2019.1 使用教程