1. 程式人生 > >Hadoop Hive基礎sql語法

Hadoop Hive基礎sql語法

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL 去查詢分析需要的內容,這套SQL 簡稱Hive SQL,使不熟悉mapreduce 的使用者很方便的利用SQL 語言查詢,彙總,分析資料。而mapreduce開發人員可以把己寫的mapper 和reducer 作為外掛來支援Hive 做更復雜的資料分析。

它與關係型資料庫的SQL 略有不同,但支援了絕大多數的語句如DDL、DML 以及常見的聚合函式、連線查詢、條件查詢。HIVE不適合用於聯機online)事務處理,也不提供實時查詢功能。它最適合應用在基於大量不可變資料的批處理作業。

HIVE的特點:可伸縮(在Hadoop的叢集上動態的新增裝置),可擴充套件,容錯,輸入格式的鬆散耦合。

Hive 的官方文件中對查詢語言有了很詳細的描述,請參考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的內容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項。

1. DDL 操作

建表

刪除表

修改表結構

建立/刪除檢視

建立資料庫

顯示命令

1.2 建表:

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 建立一個指定名字的表。如果相同名字的表已經存在,則丟擲異常;使用者可以用 IF NOT EXIST 選項來忽略這個異常

EXTERNAL 關鍵字可以讓使用者建立一個外部表,在建表的同時指定一個指向實際資料的路徑(LOCATION)

LIKE 允許使用者複製現有的表結構,但是不復制資料

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, ...)]

使用者在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。在建表的時候,使用者還需要為表指定列,使用者在指定表的列的同時也會指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的資料。

STORED AS

SEQUENCEFILE

| TEXTFILE

| RCFILE

| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

如果檔案資料是純文字,可以使用 STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCE 。

1.3 建立簡單表:

hive> CREATE TABLE pokes (foo INT, bar STRING);

1.4 建立外部表:

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>';

1.5 建分割槽表

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;

1.6 建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;

1.7 建立表並建立索引欄位ds

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

1.8 複製一個空表

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';

匯入資料表的資料格式是:欄位之間是tab鍵分割,行之間是斷行。

及要我們的檔案內容格式:

100636  100890  c5c86f4cddc15eb7        yyyvybtvt
100612  100865  97cc70d411c18b6f        gyvcycy
100078  100087  ecd6026a15ffddf5        qa000100

1.9 顯示所有表:

hive> SHOW TABLES;

1.10 按正條件(正則表示式)顯示錶,

hive> SHOW TABLES '.*s';

增加分割槽、刪除分割槽

重命名錶

修改列的名字、型別、位置、註釋

增加/更新列

增加表的元資料資訊

1.21 表新增一列:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

1.22 新增一列並增加列欄位註釋

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

1.23 更改表名:

hive> ALTER TABLE events RENAME TO 3koobecaf;

1.24 刪除列:

hive> DROP TABLE pokes;

1.25 增加、刪除分割槽

增加

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,...

1.26 重命名錶

ALTER TABLE table_name RENAME TO new_table_name

1.27 修改列的名字、型別、位置、註釋:

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

這個命令可以允許改變列名、資料型別、註釋、列位置或者它們的任意組合

1.28 表新增一列:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

1.29 新增一列並增加列欄位註釋

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

1.30 增加/更新列

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

ADD是代表新增一欄位,欄位位置在所有列後面(partition列前)

REPLACE則是表示替換表中所有欄位。

1.31 增加表的元資料資訊

ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:

:[property_name = property_value…..]

使用者可以用這個命令向表中增加metadata

1.31改變表文件格式與組織

ALTER TABLE table_name SET FILEFORMAT file_format
ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS

這個命令修改了表的物理儲存屬性

1.4 建立/刪除檢視

CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) 
][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT

增加檢視

如果沒有提供表名,檢視列的名字將由定義的SELECT表示式自動生成

如果修改基本表的屬性,檢視中不會體現,無效查詢將會失敗

檢視是隻讀的,不能用LOAD/INSERT/ALTER

DROP VIEW view_name

刪除檢視

1.5 建立資料庫

CREATE DATABASE name

1.6 顯示命令

show tables;
?show databases;
?show partitions ;
?show functions
?describe extended table_name dot col_name

2. DML 操作:元資料儲存

hive不支援用insert語句一條一條的進行插入操作,也不支援update操作。資料是以load的方式載入到建立好的表中。資料一旦匯入就不可以修改。

DML包括:INSERT插入、UPDATE更新、DELETE刪除

向資料表內載入檔案

將查詢結果插入到Hive表中

0.8新特性 insert into

2.1.0 向資料表內載入檔案

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

Load 操作只是單純的複製/移動操作,將資料檔案移動到 Hive 表對應的位置。

filepath

相對路徑,例如:project/data1

絕對路徑,例如: /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;

2.1.1 載入本地資料,同時給定分割槽資訊

載入的目標可以是一個表或者分割槽。如果表包含分割槽,必須指定每一個分割槽的分割槽名

filepath 可以引用一個檔案(這種情況下,Hive 會將檔案移動到表所對應的目錄中)或者是一個目錄(在這種情況下,Hive 會將目錄中的所有檔案移動至表所對應的目錄中)

LOCAL關鍵字

指定了LOCAL,即本地

load 命令會去查詢本地檔案系統中的 filepath。如果發現是相對路徑,則路徑會被解釋為相對於當前使用者的當前路徑。使用者也可以為本地檔案指定一個完整的 URI,比如:file:///user/hive/project/data1.

load 命令會將 filepath 中的檔案複製到目標檔案系統中。目標檔案系統由表的位置屬性決定。被複制的資料檔案移動到表的資料對應的位置

例如:載入本地資料,同時給定分割槽資訊:

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

沒有指定LOCAL

如果 filepath 指向的是一個完整的 URI,hive 會直接使用這個 URI。 否則

如果沒有指定 schema 或者 authority,Hive 會使用在 hadoop 配置檔案中定義的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI

如果路徑不是絕對的,Hive 相對於 /user/ 進行解釋。 Hive 會將 filepath 中指定的檔案內容移動到 table (或者 partition)所指定的路徑中

2.1.2 載入DFS資料,同時給定分割槽資訊:

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

目標表(或者分割槽)中的內容(如果有)會被刪除,然後再將 filepath 指向的檔案/目錄中的內容新增到表/分割槽中。

如果目標表(分割槽)已經有一個檔案,並且檔名和 filepath 中的檔名衝突,那麼現有的檔案會被新檔案所替代。

2.1.3 將查詢結果插入Hive表

將查詢結果插入Hive表

將查詢結果寫入HDFS檔案系統

基本模式

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] ...

自動分割槽模式

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

2.1.5 將查詢結果寫入HDFS檔案系統

Hello World!

資料寫入檔案系統時進行文字序列化,且每列用^A 來區分,\n換行

2.1.6 INSERT INTO

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

3. DQL 操作:資料查詢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選項區分對重複記錄的處理。預設是ALL,表示查詢所有記錄。DISTINCT表示去掉重複的記錄

Where 條件

類似我們傳統SQL的where 條件

目前支援 AND,OR ,0.9版本支援between

IN, NOT IN

不支援EXIST ,NOT EXIST

ORDER BY與SORT BY的不同

ORDER BY 全域性排序,只有一個Reduce任務

SORT BY 只在本機做排序

Limit

Limit 可以限制查詢的記錄數

SELECT * FROM t1 LIMIT 5

實現Top k 查詢

下面的查詢語句查詢銷售記錄最大的 5 個銷售代表。

SET mapred.reduce.tasks = 1

SELECT * FROM test SORT BY amount DESC LIMIT 5

?REGEX Column Specification

SELECT 語句可以使用正則表示式做列選擇,下面的語句查詢除了 ds 和 hr 之外的所有列:

SELECT `(ds|hr)?+.+` FROM test

例如

按先件查詢

hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';

將查詢資料輸出至目錄:

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';

將查詢結果輸出至本地目錄:

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;

將一個表的統計結果插入另一個表中:

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;

將多表資料插入到同一表中:

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;

將檔案流直接插入檔案:


            
           

相關推薦

Hadoop Hive基礎sql語法

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL

Hadoop Hive基礎SQL語法(DML 操作:元資料儲存)

2. DML操作:元資料儲存 hive不支援用insert語句一條一條的進行插入操作,也不支援update操作。資料是以load的方式載入到建立好的表中。資料一旦匯入就不可以修改。 DML包括:INSERT插入、UPDATE更新、DELETE刪除 •向

Hive基礎sql語法(DDL)

而且 包含 att com sel nts state 刪除 local 前言: 經過前面的學習 我們了解到Hive可以使用關系型數據庫來存儲元數據,而且Hive提供了比較完整的SQL功能 ,這篇文章主要介紹Hive基本的sql語法。 首先了解下Hive的數據存儲結構,

Hive基礎sql語法(DML)

reside fine 不常用 就是 total asi ins -a TE DML操作(Data Manipulation Language) 參考官方文檔: DML文檔 因update和delete在Hive中一般用不到,本篇文章不做講解。本文主要介紹Load和ins

008-Hadoop Hive sql語法詳解3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

017-Hadoop Hive sql語法詳解7-去重排序、數據傾斜

col 去重排序 sel cluster 可能 更多 分發 指定 clust 一、數據去重排序 1.1、去重   distinct與group by   盡量避免使用distinct進行排重,特別是大表操作,用group by代替   -- 不建議 selec

016-Hadoop Hive sql語法詳解6-job輸入輸出優化、數據剪裁、減少job數、動態分區

分享 hive table 取數 nbsp put union 正在 style 一、job輸入輸出優化 善用muti-insert、union all,不同表的union all相當於multiple inputs,同一個表的union all,相當map一次輸出多條

Hadoop Hive sql語法詳解

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL

Hadoop Hive sql語法詳解5--HiveQL與SQL區別

1.hive內聯支援什麼格式?2.分號字元注意什麼問題?3.hive中empty是否為null? 4.hive是否支援插入現有表或則分割槽中? 5.hive是否支援INSERT INTO 表 values()? 1、Hive不支援等值連線 •SQL中對兩表內聯可以寫成:•s

Hadoop Hive sql語法詳解3--DML 操作:元資料儲存

轉載自:http://www.aboutyun.com/thread-7326-1-1.html 1 基本的Select 操作 SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_referenc

Hadoop Hive sql語法詳解1-認識hive及DDL操作

轉載自:http://www.aboutyun.com/thread-7324-1-1.html 1.認識hive:Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔

【大資料零基礎SQL語法2

想知道員工所屬部門是什麼、在什麼地方、所屬工資等級是什麼? select a.ename,a.deptno,(a.sal+IFNULL(a.comm, 0)) as salcomm, s.grade, b.dname,b.loc from emp a left join dept b on a.deptno=

Hive sql語法詳解

1.  DDL 操作 DDL •建表 •刪除表 •修改表結構 •建立/刪除檢視 •建立資料庫 •顯示命令 建表: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type [COMMENT

【轉】基於Hadoop的資料倉庫Hive 基礎知識

基於Hadoop的資料倉庫Hive 基礎知識 - miao君的文章 - 知乎 https://zhuanlan.zhihu.com/p/25608332 Hive是基於Hadoop的資料倉庫工具,可對儲存在HDFS上的檔案中的資料集進行資料整理、特殊查詢和分析處理,提供了類

程式中執行hive sql出錯[FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask]

執行SQL時出了個錯: SQL: INSERT OVERWRITE DIRECTORY 'result/testConsole' select count(1) from nutable;  錯誤資訊: Failed with exception Unable to rename: hdfs://in

hive中執行sql語句:SemanticException org.apache.hadoop.hive.ql.metadata.HiveException:

hive> show databases; FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to

SQL——語法基礎篇(上)

用資料庫的方式思考SQL是如何執行的 雖然 SQL 是宣告式語言,我們可以像使用英語一樣使用它,不過在 RDBMS(關係型資料庫管理系統)中,SQL 的實現方式還是有差別的。今天我們就從資料庫的角度來思考一下 SQL 是如何被執行的。 Oracle 中的 SQL 是如何執行的 我們先來看下 SQL 在 Ora

淘寶數據庫OceanBase SQL編譯器部分 源代碼閱讀--解析SQL語法

git itemtype 工具 銷毀 cin bsp 年輕 you any OceanBase是阿裏巴巴集團自主研發的可擴展的關系型數據庫,實現了跨行跨表的事務,支持數千億條記錄、數百TB數據上的SQL操作。在阿裏巴巴集團下,OceanBase數據庫支持了多個重

Day1[下] - Python基礎 基本語法、流程控制

數字 tin 流程 label reference rst too ren ogr 一、變量\字符編碼 Variables are used to store information to be referenced and manipulated in a comput

解決kylin報錯 ClassCastException org.apache.hadoop.hive.ql.exec.ConditionalTask cannot be cast to org.apache.hadoop.hive.ql.exec.mr.MapRedTask

conf lan exe hive oop ann 關於 .exe map 方法:去掉參數SET hive.auto.convert.join=true; 從配置文件$KYLIN_HOME/conf/kylin_hive_conf.xml刪掉 或 kylin-gui的cu