BigBrother的大数据之旅Day 11 hive(2)
HIVE參數
| hiveconf | 可讀寫 | hive-site.xml當中的各配置變量 例:hive --hiveconf hive.cli.print.header=true 只當前會話有效 |
| system | 可讀寫 | 系統變量,包含JVM運行參數等 例:set system:user.name=root 當前會話有效 在命令行中hive> |
| env | 只讀 | 環境變量 例:env:JAVA_HOME |
| hivevar | 可讀寫 | 例:hive -d val=key 當前cli有效 啟動hive時加入參數(用的比較少) |
a, 在命令行輸入 set;當前會話中的所有變量都展示出來
b,在家目錄.hivehistory中有敲過端所有命令和結果
c,家目錄.hiverc中可以設置參數(hive的參數初始化)
d,set system:user.name=lisi; 設置當前用戶為lisi
詳述動態分區以及SQL
動態分區
動態分區: 數據自動分區,和靜態分區相比,數據不需要在添加的時候直接指定分區了
1 開啟動態分區
(必須設置的參數)
set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partitohn.mode=nonstricet(不是no是non)
strict時至少有一個靜態分區
(可選參數)
set hive.exec.max.dynamic.partitions.pernode;
每一個執行mr節點上,允許創建的動態分區的最大數量(100)
set hive.exec.max.dynamic.partitions;
所有執行mr節點上,允許創建的所有動態分區的最大數量(1000)
set hive.exec.max.created.files;
所有的mr job允許創建的文件的最大數量(100000)
2 創建表
create table tb_user2(id int,name string,age int,sex string,likes array<string>,addrs map<string, string>)row formatdelimitedfields terminated by ","collection items terminated by "-"map keys terminated by ":"lines terminated by "\n";創建分區表
create table tb_user3(id int,name string,likes array<string>,addrs map<string, string>)partitioned by(age int,sex string)row formatdelimitedfields terminated by ","collection items terminated by "-"map keys terminated by ":"lines terminated by "\n"; from tb_user2 insert into tb_user3 partition(age,sex)select id,name,likes,addrs,age,sex;結果
靜態分區塊,動態分區開啟了mapreduce任務,所以慢
hive 視圖
1 不支持物化視圖,每次視圖都是一個子查詢
2 只能查詢
分桶
分桶表是對列值取哈希值的方式,將不同數據放到不同文件中存儲。
對于hive中每一個表、分區都可以進一步進行分桶。
由列的哈希值除以桶的個數來決定每條數據劃分在哪個桶中。
主要適用場景:數據抽樣
抽樣表: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
TABLESAMPLE子句允許用戶對表中數據抽樣,而不是獲取全表數據。 TABLESAMPLE子句可以跟在任何表的from子句之后。桶從1開始計數。colname表示通過哪列進行抽樣。colname可以是表中非分區列或者rand()表示對一整行而非單個列進行抽樣。表中的記錄根據指定的列分桶到y個桶中(從1到y)。返回屬于x桶的列。
下面SQL語句表示source表中分桶為32個桶之后返回第三個桶的數據。's’是表的別名:
SELECT * FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;
上面的效率不高
一般情況下,TABLESAMPLE會掃描整張表來獲取抽樣數據,效率不高。在創建表的時候可以通過clustered by子句指定一列或幾列將表的數據先使用hash分區。如果TABLESAMPLE子句指定的列和clustered by子句中的列一樣,TABLESAMPLE子句只掃描表中需要的hash分區并返回:
如果上面例子中,表source創建的時候使用了’clustered by id into 32 buckets’,則:
TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)
TABLESAMPLE(BUCKET X OUT OF y ON id)
N:桶的個數,一共多少桶 – 例如32個
x:第一個取端桶 --例如2
y:桶的個數或者因子,可以理解為步長-- 例如 4
32/4=8 , 取8份數據
2 ,6,10,14…30
1 開啟分桶
set hive.enforce.bucketing=true;
2 創建分桶表
CREATE TABLE tb_bucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;
3 導入數據(從其他表中)
insert into tb_bucket select id,name,age from tb_user2;
4 進行分桶抽樣
select * from tb_bucket tablesample(bucket 2 out of 4);
權限管理
三種授權方式
1、Storage Based Authorization in the Metastore Server
基于存儲的授權 - 可以對Metastore中的元數據進行保護,但是沒有提供更加細粒度的訪問控制(例如:列級別、行級別)。
2、SQL Standards Based Authorization in HiveServer2
基于SQL標準的Hive授權 - 完全兼容SQL的授權模型,推薦使用該模式。
3、Default Hive Authorization (Legacy Mode)
hive默認授權 - 設計目的僅僅只是為了防止用戶產生誤操作,而不是防止惡意用戶訪問未經授權的數據。
修改權限為hiveserver2
1 修改服務器配置文件
<property><name>hive.security.authorization.enabled</name><value>true</value> </property> <property><name>hive.server2.enable.doAs</name><value>false</value> </property> <property><name>hive.users.in.admin.role</name><value>root</value> </property> <property><name>hive.security.authorization.manager</name><value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value> </property> <property><name>hive.security.authenticator.manager</name><value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value> </property>2 服務端啟動hiveserver2;客戶端通過beeline進行連接
3 使用命令對權限進行管理
CREATE ROLE role_name; -- 創建角色 DROP ROLE role_name; -- 刪除角色 SET ROLE (role_name|ALL|NONE); -- 設置角色 SHOW CURRENT ROLES; -- 查看當前具有的角色 SHOW ROLES; -- 查看所有存在的角色啟動hiveserver2;客戶端通過beeline進行連接
3 使用命令對權限進行管理
CREATE ROLE role_name; -- 創建角色 DROP ROLE role_name; -- 刪除角色 SET ROLE (role_name|ALL|NONE); -- 設置角色 SHOW CURRENT ROLES; -- 查看當前具有的角色 SHOW ROLES; -- 查看所有存在的角色總結
以上是生活随笔為你收集整理的BigBrother的大数据之旅Day 11 hive(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件人才需求分析
- 下一篇: TED演讲的字幕下载