hadoop 不適合docker,HADOOP docker(六):hive簡易使用指南

 2023-11-07 阅读 27 评论 0

摘要:前言1.hive簡介1.1 hive組件與相應功能:1.2 hive的表類型1.3 分區表1.3 分隔符1.4 hive的數據存儲2.數據類型2.1 基本數據類型2.1 復雜數據類型2.3 NULL3.基本操作3.1 數據庫操作3.2 表操作3.3 視圖3.4 數據導入導出3.hsql3.1 hsql基本操作3.2 hive內置函數3.2 自定義函數3.3

前言
1.hive簡介
1.1 hive組件與相應功能:
1.2 hive的表類型
1.3 分區表
1.3 分隔符
1.4 hive的數據存儲
2.數據類型
2.1 基本數據類型
2.1 復雜數據類型
2.3 NULL
3.基本操作
3.1 數據庫操作
3.2 表操作
3.3 視圖
3.4 數據導入導出
3.hsql
3.1 hsql基本操作
3.2 hive內置函數
3.2 自定義函數
3.3 注冊函數
4.hive權限管理
4.1 權限簡介
4.2 權限分類
4.3 授權管理
5.hive優化

前言

本手冊介紹了hive的基本知識及工作中要注意的要點,適用于hive入門.開發人員請關注hive表操作以及UDF.

1.hive簡介

hadoop 不適合docker?hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。

1.1 hive組件與相應功能:

  • CLI
    hive命令行工具,用于執行sql等.
  • beeline
    功能等同于CLI,區別是beeline通過hiveserver2提交請求
  • hive metatstore
    hive元數據管理服務,客戶端工具連接metastroe使用元數據
  • hiveserver2
    hiveserver2為應用程序提供JDBC接口,例如beeline
  • hcatalog
    hive元數據接口模塊

1.2 hive的表類型

  • 內部表
    內部表:通過指定的元數據格式創建的表,可以指定存儲位置\存儲格式等,完全由hive來管理.刪除內部表時同時刪除表數據.當前用sqoop導入的數據都是內部表.
  • 外部表
    外部表:hdfs上的數據,hive只是對數據做元數據映射來創建表.刪除外部表不會刪除數據.

1.3 分區表

hive支持分區表,在查詢時指定分區字段可以過濾無用分區.分為靜態分區和動態分區.

  • 靜態分區:
    靜態分區:指手動創建的分區.在創建表時需要額外指定分區鍵,如:

    docker hbase,create external table if not exists cheap_hotel_user(device string, booking_freq int, book_price string) partitioned by (day string);

    或者通過alter table來添加分區:

    ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1';

  • hadoop的使用。動態分區:
    動態分區:可以根據指定字段的值自動創建分區(參考ORACLE的數據自動插入到對應分區).默認不開啟動態分區,需要修改參數hive.exec.dynamic.partition實現,動態分區上限為10000個.

1.3 分隔符

  • 字段分隔符
    默認是\001.在建表時可以指定,如:FIELDS TERMINATED BY '\036'.注意:不要寫成'\0X1E'.
  • 行分隔符
    默認是\n,不可更改.

1.4 hive的數據存儲

  • 數據存儲格式
    hive支持Text File\SequenceFile\RCFile\Avro Files\ORC Files\Parquet以及自定義文件類型.當前使用的是ORC格式.ORC格式是一種高性能的帶壓縮的文件格式,支持多種特性,甚至支持hive的update操作.建表時指定文件格式:"STORED AS ORC". [點此了解hive文件格式]

2.數據類型

2.1 基本數據類型

類型長度示例
tinyint1byte有符號整數20
smallint2byte有符號整數20
int4byte有符號整數20
bigint8byte有符號整數20
boolean布爾類型,true or flaseTRUE
float單精度浮點數3.14159
double雙精度浮點數3.1415923
string字符.可以指定字符集,用引號或又引號'中國' "中國"
date日期類型'2017-03-06'
timestamp時間戳.整數 浮點(帶納秒)數或字符串.122327493795.123456789

2.1 復雜數據類型

類型長度示例
struct類似C語言中的結構體如果類型為struct(name string,age int),則可存的值可為 struct('bijr',3)
map鍵值對應的組合map(k1,v1,k2,v2)
array數組,和java數組一樣array('a','b','c')
union存儲指定類型中的一個或多個union(string,int,date)->union(1,'2017-03-06')

注意:表時不要使用HIVE關鍵字.

2.3 NULL

NULL代表該字段值是空缺的,查詢時顯示為'NULL',底層存儲為'\N'.像其它數據庫一樣,可以用IS (NOT) NULL來查詢.

3.基本操作

3.1 數據庫操作

  • 創建數據庫

    create database [IF NOT EXISTS] simple;

  • 查看數據庫

    show databases;

  • 刪除數據庫

    drop database [IF EXISTS] simple;

  • 選擇數據

    use simple;

3.2 表操作

  • 創建內部表

    create table [IF NOT EXISTS] test(id int,name string, age int,dt date)
    [ROW FORMAT DELIMITED]
    [FIELDS TERMINATED BY '\001']
    STORED AS ORC [LOCATION '/user/hive/SIMPLE/test'] ;

  • 創建外部表

    create EXTERNAL table [IF NOT EXISTS] test2(id int,name string, age int,dt date)
    FIELDS TERMINATED BY '\001'
    LOCATION '/tmp/test2' ;

注意:在外部表中,location是必須的,分隔符根據文件而定.

  • 創建分區表

    CREATE TABLE XDGL_HIS.FLOW_OPINION_ARCH(
    serialno string,
    opinionno string,
    objecttype string
    createtime string,
    etl_in_dt string)
    PARTITIONED BY ( p_day string)
    ROW FORMAT DELIMITED
    STORED AS ORC
    LOCATION '/user/hive/S4/CRM_SERVICE_TYPE' ;

  • 設置動態分區

    set hive.exec.dynamic.partition=true;

  • 查看表分區

    show partitions XDGL_HIS.FLOW_OPINION_ARCH;

    動態分區分區個數默認上限為10000.

  • 從一個表創建另一個表,只創建表結構

    create table test2 like test;
    create table tests as select * from test where 1=2;

  • 查看表信息

    desc test;
    desc extended test;
    desc formatted test;

    • 重命名表

      ALTER TABLE test RENAME TO testtest;

  • 查詢數據

    select name,age from test where id =2;
    select * from test where id =2;
    查詢表時,只查需要的列,不要用select *,這樣可以減少處理的數據量優化查詢速度.

  • 刪除數據

    delete from test where id=2;

  • 增加列

    ALTER TABLE test ADD COLUMNS (c1 INT);

注意:增加字段只會在現在有字段后面添加字段.

  • 刪除列
    hive沒有刪除列的操作.原因是hive只負責管理元數據,并不對HDFS上的文件中的內容做刪除.刪除列可以用replace實現,實際上就是重建表的元數據.

    ALTER TABLE test REPLACE COLUMNS (
    id int,
    name string,
    age int,
    dt date
    );

這樣就刪除掉了c1字段,實際上并未修改HDFS上的文件.

  • 修改字段

    alter table test change c1 c2 bigint;

同時修改了字段名和類型.

3.3 視圖

視圖將查詢結果展示給用戶,可以屏蔽無用數據.

  • 創建視圖
create view asselect course, teacher, buildingfrom teaches, teacher_tablewhere teaches.teacher_id = teacher_table.teacher_id and teaches.dept_name = 'CS'

視圖中并不存放數據,只存放元數據.視圖在每次被select時都會執行計算,因此可能比較慢.如果不需要實時數據,可以將視圖替換會為實體表.
注意:某些組件無法使用hive的視圖,比如presto.

3.4 數據導入導出

點擊查看hive DML文檔

  • 向表中insert數據
  1. insert inito test values(1,'yangxw',20,'2017-03-07');
    插入單條數據

  2. create table test2 likie test;
    insert into test2 select id,name,age,dt from test;
    從一個表向另外一個表插入數據

  3. insert overwrite table test2 select id,name,age,dt from test;
    從一個表向另外一個表插入數據,覆蓋原表數據

  4. insert overwrite table XDGL_HIS.FLOW_OPINION_ARCH partition(p_day = 2016)
    select serialno,opinionno,objecttype,createtime,etl_in_dt from FLOW_OPINION_ARCH_tmp;
    覆蓋指定分區.

注意:
1.新的hive版本支持insert into value()方式插入單條數據,但速度極慢,可做為測試用.
2.使用insert select 方式插入數據,必須對目標表的所有列提供數據,即不能只對指定列插入數據.如:不支持insert into test2(id ,name) select id,name from test這樣.

  • 使用load加載數據
    標準語法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]

加上LOCAL時代表是從本地加載文件,不帶LOCAL是從HDFS加載文件.

hive擴展語法(一次插入多表)

FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION …] select_statement2] …;

注意:如果導入的源文件是文本格式,則要替換文本中的 \r \n,否則在hive 的客戶端工具中會顯示異常.解決辦法:導出源文件的腳本中替換\r \n,例如在oracle導出腳本中replace(colun_name,char(10),' '),replace(colun_name,char(10),' ')

  • 數據導出到本地
    標準語法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1[ROW FORMAT row_format] [**STORED AS file_format**] (Note: Only available starting with Hive 0.11.0)SELECT … FROM …

hive擴展語法(導入到多個目錄)

FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] …

支持導出的文件格式:

DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char][NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)

LOCAL時數據導出到本地,不使用LOCAL時導出到HDFS.字段分隔符是 ^A.

  • 使用sqoop從ORACLE導數據到hive
sqoop import --connect jdbc:oracle:thin:@//${db_ipaddr}/${db_schema} --username ${db_username} --password '${db_passwd}' --query " select SERIALNO, OBJECTTYPE, OBJECTNO, FEETYPE, to_char(SYNCHDATE, 'YYYY-MM-DD HH24:mi:ss') as SYNCHDATE  from XDGL.ACCT_FEE_ARCH where SYNCHDATE > (TO_DATE('${DAY}', 'YYYY-MM-DD') -1) and  $CONDITIONS " --hcatalog-database STAGE --hcatalog-table ACCT_FEE_ARCH --hcatalog-storage-stanza 'stored as ORC' --hive-partition-key p_day --hive-partition-value ${DAY} --hive-delims-replacement " " -m 1

當前從其它系統同步到大數據平臺時,加了ETL_IN_DATE字段來標識導入時間.
注意:使用JDBC導入到hive中時,要替換文本中的 \r \n,否則在hive 的客戶端工具中會顯示異常.解決辦法:導出源文件的腳本中替換\r \n,例如在oracle導出腳本中replace(colun_name,char(10),' '),replace(colun_name,char(10),' ')

  • 使用sqoop從hive導數據到ORACLE
1.  `sqoop export --table tableName2 \ #oracle表`
2.  `--connect jdbc:oracle:thin:@127.0.0.1:1521:ORCL \`
3.  `--username username \ #oracle用戶`
4.  `--password password \ #密碼`
5.  `--hcatalog-database DB1 \ #catalog數據庫`
6.  `--hcatalog-table tableName2 \ #catalog表`
7.  `--hcatalog-partition-keys p_month \ #`
8.  `--hcatalog-partition-values 2016-11 \`
9.  `--columns "serialno",\`
10.  `"contractstatus",\`
11.  `"rno",\`
12.  `"rname",\`
13.  `"stores",\`
14.  `"sname",\`
15.  `"etl_in_dt"`

3.hsql

hsql的語法和mysql很像,.

3.1 hsql基本操作

大多數時候都可以像使用mysql一樣使用hive,以下只列出要注意的地方.
點擊查看hive用戶手冊
點擊查看hive select語句文檔

SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[   CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
  • group by,Order by, Sort by, Cluster by, and Distribute By

    • group by
      和其它數據庫的group by是一樣的

      select sum(amt),city from pos group by city;

    • order by[aes|desc] [nulls last|nulls first]
      對數據做全局排序.因所全局排序,所以只有一個reduce處理數據.
      注意:hive中order by 時null值是"最小"的,而oracle中order by 時null值是"最大"的

hive:
hive> select * from tnull order by c ;
2    NULL
1    a
hive> select * from tnull order by c desc;
1    a
2    NULL
oracle:
SQL> select * from tnull order by c ;
ID C
1 aa
2 
SQL> select * from tnull order by c desc;
ID C
2 
1 aa
  • sort by
    sort by 是在map數據傳給reduce之前排序,只能保證map內有序,不能保證全局有序.

  • Distribute By 功能.
    控制map數據如果分發給reduce,默認是hash方式.常和sort by 一起使用.

  • Cluster by
    同時具有有 sort by \Distribute By 功能.

    • 子查詢
      hive支持from where兩種子查詢:
>SELECT … FROM (subquery) AS name …   #from子查詢
>SELECT * #where in
>FROM A
>WHERE A.a IN (SELECT foo FROM B);
>SELECT A #where exits(舊版本可能不支持)
>FROM T1
>WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y);

注意:hive不支持嵌套子查詢,可以改成join來完成

select (select adress from b where b.userid=a.userid) adress from a.

3.2 hive內置函數

hive內置函數包括:操作符\字符串函數\數學函數\日期函數\分析函數(窗口函數)等.具體參考文檔.
點擊查看hive內置函數
點擊查看hive分析函數

3.2 自定義函數

點擊查看hive插件開發
創建自定義函數要使用UDF接口:

package com.example.hive.udf;import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;public final class Lower extends UDF {public Text evaluate(final Text s) {if (s == null) { return null; }return new Text(s.toString().toLowerCase());}
}

hive中計算的數據往往是巨大的,hive的函數按行數處理,因此不要在自定義函數中再嵌入循環之類的操作,如用jdbc查詢另外一個數據庫等。

3.3 注冊函數
  • 臨時函數
    先執行Add jars把函數相關的jar包加入到hive中,然后注冊:
CREATE TEMPORARY FUNCTION function_name AS class_name;
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

eg:

[hive@hadoop2 ~]$ add jar /path/to/lower.jar
hive>create temporary function xxoo_lower as 'test.ql.LowerUDF';

注意:臨時函數只在當前session有效,關了這個會話就沒了。

  • 永久函數
    同臨時函數一樣,也要把函數相關實現打成jar,不同之處是要把jar放到hdfs上
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE ``'file_uri'` `[, JAR|FILE|ARCHIVE ``'file_uri'``] ];
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

eg:

hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'

4.hive權限管理

默認情況下,hive沒有開啟權限控制,想要開啟權限控制需要設置一些參數.
hive權限的詳細操作

4.1 權限簡介

hive的權限角色分為:

  • 用戶
    用戶即LINUX操作系統用戶.hive沒有自定義的用戶.

  • 組即操作系統上的組.可以對組授權,組內所有用戶均獲得該權限.
  • 角色
    角色是權限的集合.將角色授權個用戶或組,將該用戶或組將獲得角色的所有權限.
  • 超級用戶
    hive需要寫代碼實現超級用戶

4.2 權限分類

4.3 授權管理

擁有相應權限并且有WITH ADMIN OPTION權限的用戶可以授權給別人.比如A用戶在表t上有select權限,并且有WITH ADMIN OPTION權限,那么可以授權給B用戶查詢t表的權限:

grant select on testdb.test to user B;

  • 角色
CREATE ROLE role_name
DROP ROLE role_name
  • 角色權限
GRANT ROLE role_name [, role_name] …
TO principal_specification [, principal_specification] …
[WITH ADMIN OPTION]REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] …
FROM principal_specification [, principal_specification] …principal_specification:USER user| GROUP group| ROLE role
  • 授權
GRANTpriv_type [(column_list)][, priv_type [(column_list)]] …[ON object_specification]TO principal_specification [, principal_specification] …[WITH GRANT OPTION]REVOKE [GRANT OPTION FOR]priv_type [(column_list)][, priv_type [(column_list)]] …[ON object_specification]FROM principal_specification [, principal_specification] …REVOKE ALL PRIVILEGES, GRANT OPTIONFROM user [, user] …priv_type:ALL | ALTER | UPDATE | CREATE | DROP| INDEX | LOCK | SELECT | SHOW_DATABASE object_specification:TABLE tbl_name| DATABASE db_nameprincipal_specification:USER user| GROUP group| ROLE role
  • 查詢用戶的權限
SHOW GRANT user|group|role XXX
[ON table|database [(column_list)]]

5.hive優化

hive使用的是mapreduce計算框架,因此優化都是圍繞mr來做.具體請參考:
點擊查看hive 優化官方文檔



來自為知筆記(Wiz)


轉載于:https://www.cnblogs.com/skyrim/p/7455263.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/166986.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息