
Hive 是基于Hadoop 構(gòu)建的一套數(shù)據(jù)倉庫分析系統(tǒng),它提供了豐富的SQL查詢方式來分析存儲(chǔ)在Hadoop 分布式文件系統(tǒng)中的數(shù)據(jù),可以將結(jié)構(gòu)
化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的SQL查詢功能,可以將SQL語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行,通過自己的SQL 去查詢分析需
要的內(nèi)容,這套SQL 簡(jiǎn)稱Hive SQL,使不熟悉mapreduce 的用戶很方便的利用SQL 語言查詢,匯總,分析數(shù)據(jù)。而mapreduce開發(fā)人員可以把
己寫的mapper 和reducer 作為插件來支持Hive 做更復(fù)雜的數(shù)據(jù)分析。
它與關(guān)系型數(shù)據(jù)庫的SQL 略有不同,但支持了絕大多數(shù)的語句如DDL、DML 以及常見的聚合函數(shù)、連接查詢、條件查詢。HIVE不適合用于聯(lián)機(jī)
online)事務(wù)處理,也不提供實(shí)時(shí)查詢功能。它最適合應(yīng)用在基于大量不可變數(shù)據(jù)的批處理作業(yè)。
HIVE的特點(diǎn):可伸縮(在Hadoop的集群上動(dòng)態(tài)的添加設(shè)備),可擴(kuò)展,容錯(cuò),輸入格式的松散耦合。
Hive 的官方文檔中對(duì)查詢語言有了很詳細(xì)的描述,請(qǐng)參考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的內(nèi)容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項(xiàng)。
1. DDL 操作
DDL
?建表
?刪除表
?創(chuàng)建/刪除視圖
?創(chuàng)建數(shù)據(jù)庫
?顯示命令
建表:
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]
?CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項(xiàng)來忽略這個(gè)異常
?EXTERNAL 關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION)
?LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)
?COMMENT可以為表與字段增加描述
?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ù)。
?STORED AS
SEQUENCEFILE
| TEXTFILE
| RCFILE
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCE 。
創(chuàng)建簡(jiǎn)單表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
創(chuàng)建外部表:
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User',
country STRING COMMENT 'country of origination')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
STORED AS TEXTFILE
LOCATION '<hdfs_location>';
建分區(qū)表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
ROW FORMAT DELIMITED ‘\t’
FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
建Bucket表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED ‘\t’
FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
復(fù)制一個(gè)空表
CREATE TABLE empty_key_value_store
LIKE key_value_store;
例子
create table user_info (user_id int, cid string, ckid string, username string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
導(dǎo)入數(shù)據(jù)表的數(shù)據(jù)格式是:字段之間是tab鍵分割,行之間是斷行。
及要我們的文件內(nèi)容格式:
100636 100890 c5c86f4cddc15eb7 yyyvybtvt
100612 100865 97cc70d411c18b6f gyvcycy
100078 100087 ecd6026a15ffddf5 qa000100
顯示所有表:
hive> SHOW TABLES;
按正條件(正則表達(dá)式)顯示表,
hive> SHOW TABLES '.*s';
?重命名表
?修改列的名字、類型、位置、注釋
?增加/更新列
?增加表的元數(shù)據(jù)信息
表添加一列 :
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
添加一列并增加列字段注釋
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
更改表名:
hive> ALTER TABLE events RENAME TO 3koobecaf;
刪除列:
hive> DROP TABLE pokes;
增加、刪除分區(qū)
?增加
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,...
重命名表
?ALTER TABLE table_name RENAME TO new_table_name
修改列的名字、類型、位置、注釋:
?ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
?這個(gè)命令可以允許改變列名、數(shù)據(jù)類型、注釋、列位置或者它們的任意組合
表添加一列 :
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
添加一列并增加列字段注釋
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
增加/更新列
?ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
? ADD是代表新增一字段,字段位置在所有列后面(partition列前)
REPLACE則是表示替換表中所有字段。
增加表的元數(shù)據(jù)信息
?ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:
:[property_name = property_value…..]
?用戶可以用這個(gè)命令向表中增加metadata
改變表文件格式與組織
?ALTER TABLE table_name SET FILEFORMAT file_format
?ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS
?這個(gè)命令修改了表的物理存儲(chǔ)屬性
創(chuàng)建/刪除視圖
?CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
?增加視圖
?如果沒有提供表名,視圖列的名字將由定義的SELECT表達(dá)式自動(dòng)生成
?如果修改基本表的屬性,視圖中不會(huì)體現(xiàn),無效查詢將會(huì)失敗
?視圖是只讀的,不能用LOAD/INSERT/ALTER
?DROP VIEW view_name
?刪除視圖
創(chuàng)建數(shù)據(jù)庫
?CREATE DATABASE name
顯示命令
?show tables;
?show databases;
?show partitions ;
?show functions
?describe extended table_name dot col_name
2. DML 操作:元數(shù)據(jù)存儲(chǔ)
hive不支持用insert語句一條一條的進(jìn)行插入操作,也不支持update操作。數(shù)據(jù)是以load的方式加載到建立好的表中。數(shù)據(jù)一旦導(dǎo)入就不可以修改。
DML包括:INSERT插入、UPDATE更新、DELETE刪除
?向數(shù)據(jù)表內(nèi)加載文件
?將查詢結(jié)果插入到Hive表中
?0.8新特性 insert into
向數(shù)據(jù)表內(nèi)加載文件
?LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
?Load 操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到 Hive 表對(duì)應(yīng)的位置。
?filepath
?相對(duì)路徑,例如:project/data1
?絕對(duì)路徑,例如: /user/hive/project/data1
?包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
例如:
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
加載本地?cái)?shù)據(jù),同時(shí)給定分區(qū)信息
?加載的目標(biāo)可以是一個(gè)表或者分區(qū)。如果表包含分區(qū),必須指定每一個(gè)分區(qū)的分區(qū)名
?filepath 可以引用一個(gè)文件(這種情況下,Hive 會(huì)將文件移動(dòng)到表所對(duì)應(yīng)的目錄中)或者是一個(gè)目錄(在這種情況下,Hive 會(huì)將目錄中的所有文件移動(dòng)至表所對(duì)應(yīng)的目錄中)
LOCAL關(guān)鍵字
?指定了LOCAL,即本地
?load 命令會(huì)去查找本地文件系統(tǒng)中的 filepath。如果發(fā)現(xiàn)是相對(duì)路徑,則路徑會(huì)被解釋為相對(duì)于當(dāng)前用戶的當(dāng)前路徑。用戶也可以為本地文件指定一個(gè)完整的 URI,比如:file:///user/hive/project/data1.
?load 命令會(huì)將 filepath 中的文件復(fù)制到目標(biāo)文件系統(tǒng)中。目標(biāo)文件系統(tǒng)由表的位置屬性決定。被復(fù)制的數(shù)據(jù)文件移動(dòng)到表的數(shù)據(jù)對(duì)應(yīng)的位置
例如:加載本地?cái)?shù)據(jù),同時(shí)給定分區(qū)信息:
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
? 沒有指定LOCAL
如果 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)所指定的路徑中
加載DFS數(shù)據(jù) ,同時(shí)給定分區(qū)信息:
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
The
above command will load data from an HDFS file/directory to the table.
Note that loading data from HDFS will result in moving the
file/directory. As a result, the operation is almost instantaneous.
OVERWRITE
?指定了OVERWRITE
?目標(biāo)表(或者分區(qū))中的內(nèi)容(如果有)會(huì)被刪除,然后再將 filepath 指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。
?如果目標(biāo)表(分區(qū))已經(jīng)有一個(gè)文件,并且文件名和 filepath 中的文件名沖突,那么現(xiàn)有的文件會(huì)被新文件所替代。
將查詢結(jié)果插入Hive表
?將查詢結(jié)果插入Hive表
?將查詢結(jié)果寫入HDFS文件系統(tǒng)
?基本模式
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
?多插入模式
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...
?自動(dòng)分區(qū)模式
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement
將查詢結(jié)果寫入HDFS文件系統(tǒng)
?INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
?
?數(shù)據(jù)寫入文件系統(tǒng)時(shí)進(jìn)行文本序列化,且每列用^A 來區(qū)分,\n換行
INSERT INTO
?INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
3. DQL 操作:數(shù)據(jù)查詢SQL
SQL操作
?基本的Select 操作
?基于Partition的查詢
?Join
3.1 基本的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]
?使用ALL和DISTINCT選項(xiàng)區(qū)分對(duì)重復(fù)記錄的處理。默認(rèn)是ALL,表示查詢所有記錄。DISTINCT表示去掉重復(fù)的記錄
?
?Where 條件
?類似我們傳統(tǒng)SQL的where 條件
?目前支持 AND,OR ,0.9版本支持between
?IN, NOT IN
?不支持EXIST ,NOT EXIST
ORDER BY與SORT BY的不同
?ORDER BY 全局排序,只有一個(gè)Reduce任務(wù)
?SORT BY 只在本機(jī)做排序
Limit
?Limit 可以限制查詢的記錄數(shù)
SELECT * FROM t1 LIMIT 5
?實(shí)現(xiàn)Top k 查詢
?下面的查詢語句查詢銷售記錄最大的 5 個(gè)銷售代表。
SET mapred.reduce.tasks = 1
SELECT * FROM test SORT BY amount DESC LIMIT 5
?REGEX Column Specification
SELECT 語句可以使用正則表達(dá)式做列選擇,下面的語句查詢除了 ds 和 hr 之外的所有列:
SELECT `(ds|hr)?+.+` FROM test
例如
按先件查詢
hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';
將查詢數(shù)據(jù)輸出至目錄:
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
將查詢結(jié)果輸出至本地目錄:
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
選擇所有列到本地目錄 :
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
將一個(gè)表的統(tǒng)計(jì)結(jié)果插入另一個(gè)表中:
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
將多表數(shù)據(jù)插入到同一表中:
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
將文件流直接插入文件:
hive>
FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo,
a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
This
streams the data in the map phase through the script /bin/cat (like
hadoop streaming). Similarly - streaming can be used on the reduce side
(please see the Hive Tutorial or examples)
3.2 基于Partition的查詢
?一般 SELECT 查詢會(huì)掃描整個(gè)表,使用 PARTITIONED BY 子句建表,查詢就可以利用分區(qū)剪枝(input pruning)的特性
?Hive 當(dāng)前的實(shí)現(xiàn)是,只有分區(qū)斷言出現(xiàn)在離 FROM 子句最近的那個(gè)WHERE 子句中,才會(huì)啟用分區(qū)剪枝
3.3 Join
Syntax
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
table_reference:
table_factor
| join_table
table_factor:
tbl_name [alias]
| table_subquery alias
| ( table_references )
join_condition:
ON equality_expression ( AND equality_expression )*
equality_expression:
expression = expression
?Hive 只支持等值連接(equality joins)、外連接(outer joins)和(left semi joins)。Hive 不支持所有非等值的連接,因?yàn)榉堑戎颠B接非常難轉(zhuǎn)化到 map/reduce 任務(wù)
?LEFT,RIGHT和FULL OUTER關(guān)鍵字用于處理join中空記錄的情況
?LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實(shí)現(xiàn)
?join 時(shí),每次 map/reduce 任務(wù)的邏輯是這樣的:reducer 會(huì)緩存 join 序列中除了最后一個(gè)表的所有表的記錄,再通過最后一個(gè)表將結(jié)果序列化到文件系統(tǒng)
?實(shí)踐中,應(yīng)該把最大的那個(gè)表寫在最后
join 查詢時(shí),需要注意幾個(gè)關(guān)鍵點(diǎn)
?只支持等值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)
?可以 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ù)
LEFT,RIGHT和FULL OUTER
?例子
?SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
?如果你想限制 join 的輸出,應(yīng)該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫
?
?容易混淆的問題是表分區(qū)的情況
? SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key)
WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
?如果 d 表中找不到對(duì)應(yīng) c 表的記錄,d 表的所有列都會(huì)列出 NULL,包括 ds 列。也就是說,join 會(huì)過濾 d 表中不能找到匹配 c 表 join key 的所有記錄。這樣的話,LEFT OUTER 就使得查詢結(jié)果與 WHERE 子句無關(guān)
?解決辦法
?SELECT c.val, d.val FROM c LEFT OUTER JOIN d
ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')
LEFT SEMI JOIN
?LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設(shè)置過濾條件,在 WHERE 子句、SELECT 子句或其他地方過濾都不行
?
?SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
可以被重寫為:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
UNION ALL
?用來合并多個(gè)select的查詢結(jié)果,需要保證select中字段須一致
?select_statement UNION ALL select_statement UNION ALL select_statement ...
4. 從SQL到HiveQL應(yīng)轉(zhuǎn)變的習(xí)慣
1、Hive不支持等值連接
?SQL中對(duì)兩表內(nèi)聯(lián)可以寫成:
?select * from dual a,dual b where a.key = b.key;
?Hive中應(yīng)為
?select * from dual a join dual b on a.key = b.key;
而不是傳統(tǒng)的格式:
SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
2、分號(hào)字符
?分號(hào)是SQL語句結(jié)束標(biāo)記,在HiveQL中也是,但是在HiveQL中,對(duì)分號(hào)的識(shí)別沒有那么智慧,例如:
?select concat(key,concat(';',key)) from dual;
?但HiveQL在解析語句時(shí)提示:
FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification
?解決的辦法是,使用分號(hào)的八進(jìn)制的ASCII碼進(jìn)行轉(zhuǎn)義,那么上述語句應(yīng)寫成:
?select concat(key,concat('\073',key)) from dual;
3、IS [NOT] NULL
?SQL中null代表空值, 值得警惕的是, 在HiveQL中String類型的字段若是空(empty)字符串, 即長度為0, 那么對(duì)它進(jìn)行IS NULL的判斷結(jié)果是False.
4、Hive不支持將數(shù)據(jù)插入現(xiàn)有的表或分區(qū)中,
僅支持覆蓋重寫整個(gè)表,示例如下:
INSERT OVERWRITE TABLE t14、hive不支持INSERT INTO, UPDATE, DELETE操作
這樣的話,就不要很復(fù)雜的鎖機(jī)制來讀寫數(shù)據(jù)。
INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分區(qū)中追加數(shù)據(jù)。
5、hive支持嵌入mapreduce程序,來處理復(fù)雜的邏輯
如:
FROM (
MAP doctext USING 'python wc_mapper.py' AS (word, cnt)
FROM docs
CLUSTER BY word
) a
REDUCE word, cnt USING 'python wc_reduce.py';
--doctext: 是輸入
--word, cnt: 是map程序的輸出
--CLUSTER BY: 將wordhash后,又作為reduce程序的輸入
并且map程序、reduce程序可以單獨(dú)使用,如:
FROM (
FROM session_table
SELECT sessionid, tstamp, data
DISTRIBUTE BY sessionid SORT BY tstamp
) a
REDUCE sessionid, tstamp, data USING 'session_reducer.sh';
--DISTRIBUTE BY: 用于給reduce程序分配行數(shù)據(jù)
6、hive支持將轉(zhuǎn)換后的數(shù)據(jù)直接寫入不同的表,還能寫入分區(qū)、hdfs和本地目錄。
這樣能免除多次掃描輸入表的開銷。
FROM t1
INSERT OVERWRITE TABLE t2
SELECT t3.c2, count(1)
FROM t3
WHERE t3.c1 <= 20
GROUP BY t3.c2
INSERT OVERWRITE DIRECTORY '/output_dir'
SELECT t3.c2, avg(t3.c1)
FROM t3
WHERE t3.c1 > 20 AND t3.c1 <= 30
GROUP BY t3.c2
INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'
SELECT t3.c2, sum(t3.c1)
FROM t3
WHERE t3.c1 > 30
GROUP BY t3.c2;
5. 實(shí)際示例
創(chuàng)建一個(gè)表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
STORED AS TEXTFILE;
下載示例數(shù)據(jù)文件,并解壓縮
wget http://www.grouplens.org/system/files/ml-data.tar__0.gz
tar xvzf ml-data.tar__0.gz
加載數(shù)據(jù)到表中:
LOAD DATA LOCAL INPATH 'ml-data/u.data'
OVERWRITE INTO TABLE u_data;
統(tǒng)計(jì)數(shù)據(jù)總量:
SELECT COUNT(1) FROM u_data;
現(xiàn)在做一些復(fù)雜的數(shù)據(jù)分析:
創(chuàng)建一個(gè) weekday_mapper.py: 文件,作為數(shù)據(jù)按周進(jìn)行分割
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('/t')
生成數(shù)據(jù)的周信息
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '/t'.join([userid, movieid, rating, str(weekday)])
使用映射腳本
//創(chuàng)建表,按分割符分割行中的字段值
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t';
//將Python文件加載到系統(tǒng)
add FILE weekday_mapper.py;
將數(shù)據(jù)按周進(jìn)行分割
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
SELECT weekday, COUNT(1)
FROM u_data_new
GROUP BY weekday;
處理Apache Weblog 數(shù)據(jù)
將WEB日志先用正則表達(dá)式進(jìn)行組合,再按需要的條件進(jìn)行組合輸入到表中
add jar ../build/contrib/hive_contrib.jar;
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex"
= "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/")
(-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10