小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Hive簡(jiǎn)介

 路人甲Java 2022-09-22 發(fā)布于北京

1.1  Hive簡(jiǎn)介

1.1.1 什么是Hive

Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能。

1.1.2 為什么使用Hive

  • 直接使用hadoop所面臨的問題

人員學(xué)習(xí)成本太高

項(xiàng)目周期要求太短

MapReduce實(shí)現(xiàn)復(fù)雜查詢邏輯開發(fā)難度太大

 

  • 為什么要使用Hive

操作接口采用類SQL語法,提供快速開發(fā)的能力。

避免了去寫MapReduce,減少開發(fā)人員的學(xué)習(xí)成本。

擴(kuò)展功能很方便。

1.1.3 Hive的特點(diǎn)

  • 可擴(kuò)展

Hive可以自由的擴(kuò)展集群的規(guī)模,一般情況下不需要重啟服務(wù)。

 

  • 延展性

Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來實(shí)現(xiàn)自己的函數(shù)。

 

  • 容錯(cuò)

良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問題SQL仍可完成執(zhí)行。

1.2  Hive架構(gòu)

1.2.1 架構(gòu)圖

 

 

Jobtracker是hadoop1.x中的組件,它的功能相當(dāng)于: Resourcemanager+AppMaster

 

TaskTracker 相當(dāng)于:  Nodemanager  +  yarnchild

 

 

 

 

1.2.2 基本組成

  • 用戶接口:包括 CLI、JDBC/ODBC、WebGUI。
  • 元數(shù)據(jù)存儲(chǔ):通常是存儲(chǔ)在關(guān)系數(shù)據(jù)庫如 mysql , derby中。
  • 解釋器、編譯器、優(yōu)化器、執(zhí)行器。
  • 用戶接口主要由三個(gè):CLI、JDBC/ODBC和WebGUI。其中,CLI為shell命令行;JDBC/ODBC是Hive的JAVA實(shí)現(xiàn),與傳統(tǒng)數(shù)據(jù)庫JDBC類似;WebGUI是通過瀏覽器訪問Hive。
  • 元數(shù)據(jù)存儲(chǔ):Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。
  • 解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃存儲(chǔ)在 HDFS 中,并在隨后有 MapReduce 調(diào)用執(zhí)行。

1.2.3  各組件的基本功能

1.3 Hive與Hadoop的關(guān)系

Hive利用HDFS存儲(chǔ)數(shù)據(jù),利用MapReduce查詢數(shù)據(jù)

 

 

 

 

1.4 Hive與傳統(tǒng)數(shù)據(jù)庫對(duì)比

 

 

 

總結(jié):hive具有sql數(shù)據(jù)庫的外表,但應(yīng)用場(chǎng)景完全不同,hive只適合用來做批量數(shù)據(jù)統(tǒng)計(jì)分析

1.5 Hive的數(shù)據(jù)存儲(chǔ)

1、Hive中所有的數(shù)據(jù)都存儲(chǔ)在 HDFS 中,沒有專門的數(shù)據(jù)存儲(chǔ)格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)

2、只需要在創(chuàng)建表的時(shí)候告訴 Hive 數(shù)據(jù)中的列分隔符和行分隔符,Hive 就可以解析數(shù)據(jù)。

3、Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket。

2  db:在hdfs中表現(xiàn)為${hive.metastore.warehouse.dir}目錄下一個(gè)文件夾

2  table:在hdfs中表現(xiàn)所屬db目錄下一個(gè)文件夾

2  external table:與table類似,不過其數(shù)據(jù)存放位置可以在任意指定路徑

2  partition:在hdfs中表現(xiàn)為table目錄下的子目錄

2  bucket:在hdfs中表現(xiàn)為同一個(gè)表目錄下根據(jù)hash散列之后的多個(gè)文件

 

 

1.6 HIVE的安裝部署

1.6.1 安裝

單機(jī)版:

元數(shù)據(jù)庫mysql版:

 

1.6.2 使用方式

Hive交互shell

bin/hive

 

 

Hive thrift服務(wù)

 

 

啟動(dòng)方式,(假如是在hadoop01上):

啟動(dòng)為前臺(tái):bin/hiveserver2

啟動(dòng)為后臺(tái):nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &

 

啟動(dòng)成功后,可以在別的節(jié)點(diǎn)上用beeline去連接

v  方式(1)

hive/bin/beeline  回車,進(jìn)入beeline的命令界面

輸入命令連接hiveserver2

beeline> !connect jdbc:hive2//mini1:10000

(hadoop01是hiveserver2所啟動(dòng)的那臺(tái)主機(jī)名,端口默認(rèn)是10000)

v  方式(2)

或者啟動(dòng)就連接:

bin/beeline -u jdbc:hive2://mini1:10000 -n hadoop

 

接下來就可以做正常sql查詢了

 

 

Hive命令

[hadoop@hdp-node-02 ~]$ hive  -e  'sql’

 

 

2.   Hive基本操作

2.1  DDL操作

2.1.1    創(chuàng)建表

建表語法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

   [(col_name data_type [COMMENT col_comment], ...)]

   [COMMENT table_comment]

   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

   [CLUSTERED BY (col_name, col_name, ...)

   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

   [ROW FORMAT row_format]

   [STORED AS file_format]

   [LOCATION hdfs_path]

 

說明:

1、 CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項(xiàng)來忽略這個(gè)異常。

2、 EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。

3、 LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。

4、 ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

用戶在建表的時(shí)候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive通過 SerDe 確定表的具體的列的數(shù)據(jù)。

5、 STORED AS

SEQUENCEFILE|TEXTFILE|RCFILE

如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCEFILE。

 

6、CLUSTERED BY

對(duì)于每一個(gè)表(table)或者分區(qū), Hive可以進(jìn)一步組織成桶,也就是說桶是更為細(xì)粒度的數(shù)據(jù)范圍劃分。Hive也是 針對(duì)某一列進(jìn)行桶的組織。Hive采用對(duì)列值哈希,然后除以桶的個(gè)數(shù)求余的方式?jīng)Q定該條記錄存放在哪個(gè)桶當(dāng)中。

把表(或者分區(qū))組織成桶(Bucket)有兩個(gè)理由:

(1)獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時(shí)能利用這個(gè)結(jié)構(gòu)。具體而言,連接兩個(gè)在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實(shí)現(xiàn)。比如JOIN操作。對(duì)于JOIN操作兩個(gè)表有一個(gè)相同的列,如果對(duì)這兩個(gè)表都進(jìn)行了桶操作。那么將保存相同列值的桶進(jìn)行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。

(2)使取樣(sampling)更高效。在處理大規(guī)模數(shù)據(jù)集時(shí),在開發(fā)和修改查詢的階段,如果能在數(shù)據(jù)集的一小部分?jǐn)?shù)據(jù)上試運(yùn)行查詢,會(huì)帶來很多方便。

 

 

具體實(shí)例

1、  創(chuàng)建內(nèi)部表mytable。

 

 

 

2、  創(chuàng)建外部表pageview。

 

 

 

3、  創(chuàng)建分區(qū)表invites。

create table student_p(Sno int,Sname string,Sex string,Sage int,Sdept string) partitioned by(part string) row format delimited fields terminated by ','stored as textfile;

 

 

 

 

4、  創(chuàng)建帶桶的表student。

 

 

2.1.2 修改表

增加/刪除分區(qū)

ü  語法結(jié)構(gòu)

ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...

partition_spec:

: PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)

 

ALTER TABLE table_name DROP partition_spec, partition_spec,...

ü  具體實(shí)例

alter table student_p add partition(part='a') partition(part='b');

 

 

 

重命名表

ü  語法結(jié)構(gòu)

ALTER TABLE table_name RENAME TO new_table_name

ü  具體實(shí)例

 

 

增加/更新列

ü  語法結(jié)構(gòu)

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

 

注:ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE則是表示替換表中所有字段。

 

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

ü  具體實(shí)例

 

 

2.1.3 顯示命令

show tables

show databases

show partitions

show functions

desc extended t_name;

desc formatted table_name;

2.2  DML操作

2.2.1 Load

  語法結(jié)構(gòu)

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO

TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

 

說明:

1、  Load 操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到 Hive 表對(duì)應(yīng)的位置。

2、  filepath:

相對(duì)路徑,例如:project/data1

絕對(duì)路徑,例如:/user/hive/project/data1

包含模式的完整 URI,列如:

hdfs://namenode:9000/user/hive/project/data1

3、  LOCAL關(guān)鍵字

如果指定了 LOCAL, load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。

如果沒有指定 LOCAL 關(guān)鍵字,則根據(jù)inpath中的uri

 

如果指定了 LOCAL,那么:

load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。如果發(fā)現(xiàn)是相對(duì)路徑,則路徑會(huì)被解釋為相對(duì)于當(dāng)前用戶的當(dāng)前路徑。

load 命令會(huì)將 filepath中的文件復(fù)制到目標(biāo)文件系統(tǒng)中。目標(biāo)文件系統(tǒng)由表的位置屬性決定。被復(fù)制的數(shù)據(jù)文件移動(dòng)到表的數(shù)據(jù)對(duì)應(yīng)的位置。

 

如果沒有指定 LOCAL 關(guān)鍵字,如果 filepath 指向的是一個(gè)完整的 URI,hive 會(huì)直接使用這個(gè) URI。 否則:如果沒有指定 schema 或者 authority,Hive 會(huì)使用在 hadoop 配置文件中定義的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI。

如果路徑不是絕對(duì)的,Hive 相對(duì)于/user/進(jìn)行解釋。

Hive 會(huì)將 filepath 中指定的文件內(nèi)容移動(dòng)到 table (或者 partition)所指定的路徑中。

 

4、  OVERWRITE 關(guān)鍵字

如果使用了 OVERWRITE 關(guān)鍵字,則目標(biāo)表(或者分區(qū))中的內(nèi)容會(huì)被刪除,然后再將 filepath 指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。

如果目標(biāo)表(分區(qū))已經(jīng)有一個(gè)文件,并且文件名和 filepath 中的文件名沖突,那么現(xiàn)有的文件會(huì)被新文件所替代。

 

  具體實(shí)例

1、 加載相對(duì)路徑數(shù)據(jù)。

 

 

 

2、 加載絕對(duì)路徑數(shù)據(jù)。

 

 

 

3、 加載包含模式數(shù)據(jù)。

 

 

 

4、 OVERWRITE關(guān)鍵字使用。

 

 

2.2.2     Insert

  將查詢結(jié)果插入Hive表

ü  語法結(jié)構(gòu)

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

 

Multiple inserts:

FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1

[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

 

Dynamic partition inserts:

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement

 

ü  具體實(shí)例

1、基本模式插入。

 

 

 

 

2、多插入模式。

 

 

 

3、自動(dòng)分區(qū)模式。

 

 

 

v  導(dǎo)出表數(shù)據(jù)

ü  語法結(jié)構(gòu)

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

 

 

multiple inserts:

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...

 

ü  具體實(shí)例

1、導(dǎo)出文件到本地。

 

 

 

說明:

數(shù)據(jù)寫入到文件系統(tǒng)時(shí)進(jìn)行文本序列化,且每列用^A來區(qū)分,\n為換行符。用more命令查看時(shí)不容易看出分割符,可以使用: sed -e 's/\x01/|/g' filename[dht3] 來查看。

 

2、導(dǎo)出數(shù)據(jù)到HDFS。

 

 

2.2.3     SELECT

  基本的Select操作

ü  語法結(jié)構(gòu)

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]

 

注:1、order by 會(huì)對(duì)輸入做全局排序,因此只有一個(gè)reducer,會(huì)導(dǎo)致當(dāng)輸入規(guī)模較大時(shí),需要較長(zhǎng)的計(jì)算時(shí)間。

2、sort by不是全局排序,其在數(shù)據(jù)進(jìn)入reducer前完成排序。因此,如果用sort by進(jìn)行排序,并且設(shè)置mapred.reduce.tasks>1,則sort by只保證每個(gè)reducer的輸出有序,不保證全局有序。

3、distribute by(字段)根據(jù)指定的字段將數(shù)據(jù)分到不同的reducer,且分發(fā)算法是hash散列。

4、Cluster by(字段)除了具有Distribute by的功能外,還會(huì)對(duì)該字段進(jìn)行排序。

 

 

因此,如果分桶和sort字段是同一個(gè)時(shí),此時(shí),cluster by = distribute by + sort by

 

分桶表的作用:最大的作用是用來提高join操作的效率;

(思考這個(gè)問題:

select a.id,a.name,b.addr from a join b on a.id = b.id;

如果a表和b表已經(jīng)是分桶表,而且分桶的字段是id字段

做這個(gè)join操作時(shí),還需要全表做笛卡爾積嗎?)

 

 

 

 

ü  具體實(shí)例

1、獲取年齡大的3個(gè)學(xué)生。

 

 

 

2、查詢學(xué)生信息按年齡,降序排序。

 

 

 

 

 

 

 

3、按學(xué)生名稱匯總學(xué)生年齡。

 

 

 

 

2.3 Hive Join

  語法結(jié)構(gòu)

join_table:

  table_reference JOIN table_factor [join_condition]

  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition

  | table_reference LEFT SEMI JOIN table_reference join_condition

Hive 支持等值連接(equality joins)、外連接(outer joins)和(left/right joins)。Hive 不支持非等值的連接,因?yàn)榉堑戎颠B接非常難轉(zhuǎn)化到 map/reduce 任務(wù)。

另外,Hive 支持多于 2 個(gè)表的連接。

寫 join 查詢時(shí),需要注意幾個(gè)關(guān)鍵點(diǎn):

1. 只支持等值join

例如:

  SELECT a.* FROM a JOIN b ON (a.id = b.id)

  SELECT a.* FROM a JOIN b

    ON (a.id = b.id AND a.department = b.department)

是正確的,然而:

  SELECT a.* FROM a JOIN b ON (a.id>b.id)

是錯(cuò)誤的。

 

2. 可以 join 多于 2 個(gè)表。

例如

  SELECT a.val, b.val, c.val FROM a JOIN b

    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

如果join中多個(gè)表的 join key 是同一個(gè),則 join 會(huì)被轉(zhuǎn)化為單個(gè) map/reduce 任務(wù),例如:

  SELECT a.val, b.val, c.val FROM a JOIN b

    ON (a.key = b.key1) JOIN c

    ON (c.key = b.key1)

被轉(zhuǎn)化為單個(gè) map/reduce 任務(wù),因?yàn)?join 中只使用了 b.key1 作為 join key。

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1)

  JOIN c ON (c.key = b.key2)

而這一 join 被轉(zhuǎn)化為 2 個(gè) map/reduce 任務(wù)。因?yàn)?b.key1 用于第一次 join 條件,而 b.key2 用于第二次 join。

  

3.join 時(shí),每次 map/reduce 任務(wù)的邏輯:

    reducer 會(huì)緩存 join 序列中除了最后一個(gè)表的所有表的記錄,再通過最后一個(gè)表將結(jié)果序列化到文件系統(tǒng)。這一實(shí)現(xiàn)有助于在 reduce 端減少內(nèi)存的使用量。實(shí)踐中,應(yīng)該把最大的那個(gè)表寫在最后(否則會(huì)因?yàn)榫彺胬速M(fèi)大量?jī)?nèi)存)。例如:

 SELECT a.val, b.val, c.val FROM a

    JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

所有表都使用同一個(gè) join key(使用 1 次 map/reduce 任務(wù)計(jì)算)。Reduce 端會(huì)緩存 a 表和 b 表的記錄,然后每次取得一個(gè) c 表的記錄就計(jì)算一次 join 結(jié)果,類似的還有:

  SELECT a.val, b.val, c.val FROM a

    JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

這里用了 2 次 map/reduce 任務(wù)。第一次緩存 a 表,用 b 表序列化;第二次緩存第一次 map/reduce 任務(wù)的結(jié)果,然后用 c 表序列化。

 

4.LEFT,RIGHT 和 FULL OUTER 關(guān)鍵字用于處理 join 中空記錄的情況

例如:

  SELECT a.val, b.val FROM

a LEFT OUTER  JOIN b ON (a.key=b.key)

對(duì)應(yīng)所有 a 表中的記錄都有一條記錄輸出。輸出的結(jié)果應(yīng)該是 a.val, b.val,當(dāng) a.key=b.key 時(shí),而當(dāng) b.key 中找不到等值的 a.key 記錄時(shí)也會(huì)輸出:

a.val, NULL

所以 a 表中的所有記錄都被保留了;

“a RIGHT OUTER JOIN b”會(huì)保留所有 b 表的記錄。

 

Join 發(fā)生在 WHERE 子句之前。如果你想限制 join 的輸出,應(yīng)該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫。這里面一個(gè)容易混淆的問題是表分區(qū)的情況:

  SELECT a.val, b.val FROM a

  LEFT OUTER JOIN b ON (a.key=b.key)

  WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

會(huì) join a 表到 b 表(OUTER JOIN),列出 a.val 和 b.val 的記錄。WHERE 從句中可以使用其他列作為過濾條件。但是,如前所述,如果 b 表中找不到對(duì)應(yīng) a 表的記錄,b 表的所有列都會(huì)列出 NULL,包括 ds 列。也就是說,join 會(huì)過濾 b 表中不能找到匹配 a 表 join key 的所有記錄。這樣的話,LEFT OUTER 就使得查詢結(jié)果與 WHERE 子句無關(guān)了。解決的辦法是在 OUTER JOIN 時(shí)使用以下語法:

  SELECT a.val, b.val FROM a LEFT OUTER JOIN b

  ON (a.key=b.key AND

      b.ds='2009-07-07' AND

      a.ds='2009-07-07')

這一查詢的結(jié)果是預(yù)先在 join 階段過濾過的,所以不會(huì)存在上述問題。這一邏輯也可以應(yīng)用于 RIGHT 和 FULL 類型的 join 中。

 

Join 是不能交換位置的。無論是 LEFT 還是 RIGHT join,都是左連接的。

  SELECT a.val1, a.val2, b.val, c.val

  FROM a

  JOIN b ON (a.key = b.key)

  LEFT OUTER JOIN c ON (a.key = c.key)

先 join a 表到 b 表,丟棄掉所有 join key 中不匹配的記錄,然后用這一中間結(jié)果和 c 表做 join。這一表述有一個(gè)不太明顯的問題,就是當(dāng)一個(gè) key 在 a 表和 c 表都存在,但是 b 表中不存在的時(shí)候:整個(gè)記錄在第一次 join,即 a JOIN b 的時(shí)候都被丟掉了(包括a.val1,a.val2和a.key),然后我們?cè)俸?c 表 join 的時(shí)候,如果 c.key 與 a.key 或 b.key 相等,就會(huì)得到這樣的結(jié)果:NULL, NULL, NULL, c.val

 

  具體實(shí)例

1、  獲取已經(jīng)分配班級(jí)的學(xué)生姓名。

 

 

 

2、  獲取尚未分配班級(jí)的學(xué)生姓名。

 

 

 

3、  LEFT  SEMI  JOIN是IN/EXISTS的高效實(shí)現(xiàn)。

 

 

 

 

3 Hive Shell參數(shù)

3.1 Hive命令行

  語法結(jié)構(gòu)

hive [-hiveconf x=y]* [<-i filename>]* [<-f filename>|<-e query-string>] [-S]

說明:

1、  -i 從文件初始化HQL。

2、  -e從命令行執(zhí)行指定的HQL

3、  -f 執(zhí)行HQL腳本

4、  -v 輸出執(zhí)行的HQL語句到控制臺(tái)

5、  -p <port> connect to Hive Server on port number

6、  -hiveconf x=y Use this to set hive/hadoop configuration variables.

  具體實(shí)例

1、運(yùn)行一個(gè)查詢。

 

 

 

2、運(yùn)行一個(gè)文件。

 

 

 

3、運(yùn)行參數(shù)文件。

 

 

 

 

3.2 Hive參數(shù)配置方式

Hive參數(shù)大全:

https://cwiki./confluence/display/Hive/Configuration+Properties

 

開發(fā)Hive應(yīng)用時(shí),不可避免地需要設(shè)定Hive的參數(shù)。設(shè)定Hive的參數(shù)可以調(diào)優(yōu)HQL代碼的執(zhí)行效率,或幫助定位問題。然而實(shí)踐中經(jīng)常遇到的一個(gè)問題是,為什么設(shè)定的參數(shù)沒有起作用?這通常是錯(cuò)誤的設(shè)定方式導(dǎo)致的。

 

對(duì)于一般參數(shù),有以下三種設(shè)定方式:

l  配置文件

l  命令行參數(shù)

l  參數(shù)聲明

 

配置文件:Hive的配置文件包括

l  用戶自定義配置文件:$HIVE_CONF_DIR/hive-site.xml

l  默認(rèn)配置文件:$HIVE_CONF_DIR/hive-default.xml

用戶自定義配置會(huì)覆蓋默認(rèn)配置。

另外,Hive也會(huì)讀入Hadoop的配置,因?yàn)镠ive是作為Hadoop的客戶端啟動(dòng)的,Hive的配置會(huì)覆蓋Hadoop的配置。

配置文件的設(shè)定對(duì)本機(jī)啟動(dòng)的所有Hive進(jìn)程都有效。

 

命令行參數(shù):?jiǎn)?dòng)Hive(客戶端或Server方式)時(shí),可以在命令行添加-hiveconf param=value來設(shè)定參數(shù),例如:

bin/hive -hiveconf hive.root.logger=INFO,console

這一設(shè)定對(duì)本次啟動(dòng)的Session(對(duì)于Server方式啟動(dòng),則是所有請(qǐng)求的Sessions)有效。

 

參數(shù)聲明:可以在HQL中使用SET關(guān)鍵字設(shè)定參數(shù),例如:

set mapred.reduce.tasks=100;

這一設(shè)定的作用域也是session級(jí)的。

 

上述三種設(shè)定方式的優(yōu)先級(jí)依次遞增。即參數(shù)聲明覆蓋命令行參數(shù),命令行參數(shù)覆蓋配置文件設(shè)定。注意某些系統(tǒng)級(jí)的參數(shù),例如log4j相關(guān)的設(shè)定,必須用前兩種方式設(shè)定,因?yàn)槟切﹨?shù)的讀取在Session建立以前已經(jīng)完成了。

 

 

 

4. Hive函數(shù)

4.1 內(nèi)置運(yùn)算符

內(nèi)容較多,見《Hive官方文檔》

 

4.2 內(nèi)置函數(shù)

內(nèi)容較多,見《Hive官方文檔》   (比如String 的 length  substring  replace 等)

https://cwiki./confluence/display/Hive/LanguageManual+UDF

 

測(cè)試各種內(nèi)置函數(shù)的快捷方法:

1、創(chuàng)建一個(gè)dual表

create table dual(id string);

2、load一個(gè)文件(一行,一個(gè)空格)到dual表

3、select substr('angelababy',2,3) from dual;

 

 

 

4.3 Hive自定義函數(shù)和Transform

當(dāng)Hive提供的內(nèi)置函數(shù)無法滿足你的業(yè)務(wù)處理需要時(shí),此時(shí)就可以考慮使用用戶自定義函數(shù)(UDF:user-defined function)。

4.3.1 自定義函數(shù)類別

UDF  作用于單個(gè)數(shù)據(jù)行,產(chǎn)生一個(gè)數(shù)據(jù)行作為輸出。(數(shù)學(xué)函數(shù),字符串函數(shù))

UDAF(用戶定義聚集函數(shù)):接收多個(gè)輸入數(shù)據(jù)行,并產(chǎn)生一個(gè)輸出數(shù)據(jù)行。(count,max)

 

4.3.2 UDF開發(fā)實(shí)例

l  簡(jiǎn)單UDF示例

1、先開發(fā)一個(gè)java類,繼承UDF,并重載evaluate方法

package cn.hadoop.bigdata.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());

    }

}

 

2、打成jar包上傳到服務(wù)器

3、將jar包添加到hive的classpath

hive>add JAR /home/hadoop/udf.jar;

4、創(chuàng)建臨時(shí)函數(shù)與開發(fā)好的java class關(guān)聯(lián)

Hive>create temporary function tolowercase as 'cn.hadoop.bigdata.udf.ToProvince';

 

5、即可在hql中使用自定義的函數(shù)tolowercase

Select tolowercase(name) fromt_text;

l  Json數(shù)據(jù)解析UDF開發(fā)

 

 

 

 

4.3.3 Transform實(shí)現(xiàn)

Hive的 TRANSFORM 關(guān)鍵字提供了在SQL中調(diào)用自寫腳本的功能

適合實(shí)現(xiàn)Hive中沒有的功能又不想寫UDF的情況

 

使用示例1:下面這句sql就是借用了weekday_mapper.py對(duì)數(shù)據(jù)進(jìn)行了處理.

CREATE TABLE u_data_new (

  movieid INT,

  rating INT,

  weekday INT,

  userid INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t';

 

add FILE weekday_mapper.py;

 

INSERT OVERWRITE TABLE u_data_new

SELECT

  TRANSFORM (movieid , rate, timestring,uid)

  USING 'python weekday_mapper.py'

  AS (movieid, rating, weekday,userid)

FROM t_rating;

 

其中weekday_mapper.py內(nèi)容如下

#!/bin/python

import sys

import datetime

 

for line in sys.stdin:

  line = line.strip()

  movieid, rating, unixtime,userid = line.split('\t')

  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

  print '\t'.join([movieid, rating, str(weekday),userid])

 

 

 


  1. 查詢語言。由于 SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉庫中,因此,專門針對(duì) Hive 的特性設(shè)計(jì)了類 SQL 的查詢語言 HQL。熟悉 SQL 開發(fā)的開發(fā)者可以很方便的使用 Hive 進(jìn)行開發(fā)。
  2. 數(shù)據(jù)存儲(chǔ)位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數(shù)據(jù)都是存儲(chǔ)在 HDFS 中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中。
  3. 數(shù)據(jù)格式。Hive 中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數(shù)據(jù)的方法(Hive 中默認(rèn)有三個(gè)文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉(zhuǎn)換,因此,Hive 在加載的過程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動(dòng)到相應(yīng)的 HDFS 目錄中。而在數(shù)據(jù)庫中,不同的數(shù)據(jù)庫有不同的存儲(chǔ)引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會(huì)按照一定的組織存儲(chǔ),因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會(huì)比較耗時(shí)。
  4. 數(shù)據(jù)更新。由于 Hive 是針對(duì)數(shù)據(jù)倉庫應(yīng)用設(shè)計(jì)的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的。因此,Hive 中不支持對(duì)數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時(shí)候中確定好的。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進(jìn)行修改的,因此可以使用 INSERT INTO ...  VALUES 添加數(shù)據(jù),使用 UPDATE ... SET 修改數(shù)據(jù)。
  5. 索引。之前已經(jīng)說過,Hive 在加載數(shù)據(jù)的過程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描,因此也沒有對(duì)數(shù)據(jù)中的某些 Key 建立索引。Hive 要訪問數(shù)據(jù)中滿足條件的特定值時(shí),需要暴力掃描整個(gè)數(shù)據(jù),因此訪問延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問數(shù)據(jù),因此即使沒有索引,對(duì)于大數(shù)據(jù)量的訪問,Hive 仍然可以體現(xiàn)出優(yōu)勢(shì)。數(shù)據(jù)庫中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引,因此對(duì)于少量的特定條件的數(shù)據(jù)的訪問,數(shù)據(jù)庫可以有很高的效率,較低的延遲。由于數(shù)據(jù)的訪問延遲較高,決定了 Hive 不適合在線數(shù)據(jù)查詢。
  6. 執(zhí)行。Hive 中大多數(shù)查詢的執(zhí)行是通過 Hadoop 提供的 MapReduce 來實(shí)現(xiàn)的,而數(shù)據(jù)庫通常有自己的執(zhí)行引擎。
  7. 執(zhí)行延遲。之前提到,Hive 在查詢數(shù)據(jù)的時(shí)候,由于沒有索引,需要掃描整個(gè)表,因此延遲較高。另外一個(gè)導(dǎo)致 Hive 執(zhí)行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執(zhí)行 Hive 查詢時(shí),也會(huì)有較高的延遲。相對(duì)的,數(shù)據(jù)庫的執(zhí)行延遲較低。當(dāng)然,這個(gè)低是有條件的,即數(shù)據(jù)規(guī)模較小,當(dāng)數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時(shí)候,Hive 的并行計(jì)算顯然能體現(xiàn)出優(yōu)勢(shì)。
  8. 可擴(kuò)展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴(kuò)展性是和 Hadoop 的可擴(kuò)展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規(guī)模在 4000 臺(tái)節(jié)點(diǎn)左右)。而數(shù)據(jù)庫由于 ACID 語義的嚴(yán)格限制,擴(kuò)展行非常有限。目前最先進(jìn)的并行數(shù)據(jù)庫 Oracle 在理論上的擴(kuò)展能力也只有 100 臺(tái)左右。
  9. 數(shù)據(jù)規(guī)模。由于 Hive 建立在集群上并可以利用 MapReduce 進(jìn)行并行計(jì)算,因此可以支持很大規(guī)模的數(shù)據(jù);對(duì)應(yīng)的,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多