當前位置:首頁 » 編程語言 » hive常用sql語句
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hive常用sql語句

發布時間: 2022-08-21 05:11:47

⑴ 大數據雲計算好不好學習

說一下大數據的四個典型的特徵:

  • 數據量大;

  • 數據類型繁多,(結構化、非結構化文本、日誌、視頻、圖片、地理位置等);

  • 商業價值高,但需要在海量數據之上,通過數據分析與機器學習快速的挖掘出來;

  • 處理時效性高,海量數據的處理需求不再局限在離線計算當中。

第一章:Hadoop

在大數據存儲和計算中Hadoop可以算是開山鼻祖,現在大多開源的大數據框架都依賴Hadoop或者與它能很好的兼容。

關於Hadoop,你至少需要搞清楚這些是什麼:

自己學會如何搭建Hadoop,先讓它跑起來。建議先使用安裝包命令行安裝,不要使用管理工具安裝。現在都用Hadoop 2.0。

目錄操作命令;上傳、下載文件命令;提交運行MapRece示常式序;打開Hadoop WEB界面,查看Job運行狀態,查看Job運行日誌。知道Hadoop的系統日誌在哪裡。

以上完成之後,就應該去了解他們的原理了:

MapRece:如何分而治之;HDFS:數據到底在哪裡,究竟什麼才是副本;

Yarn到底是什麼,它能幹什麼;NameNode到底在幹些什麼;Resource Manager到底在幹些什麼;

如果有合適的學習網站,視頻就去聽課,如果沒有或者比較喜歡書籍,也可以啃書。當然最好的方法是先去搜索出來這些是干什麼的,大概有了概念之後,然後再去聽視頻。

第二章:更高效的WordCount

在這里,一定要學習sql,它會對你的工作有很大的幫助。

就像是你寫(或者抄)的WordCount一共有幾行代碼?但是你用SQL就非常簡單了,例如:

SELECT word,COUNT(1) FROM wordcount GROUP BY word;

這便是SQL的魅力,編程需要幾十行,甚至上百行代碼,而SQL一行搞定;使用SQL處理分析Hadoop上的數據,方便、高效、易上手、更是趨勢。不論是離線計算還是實時計算,越來越多的大數據處理框架都在積極提供SQL介面。

另外就是SQL On Hadoop之Hive於大數據而言一定要學習的。

什麼是Hive?

官方解釋如下:The Apache Hive data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax。

為什麼說Hive是數據倉庫工具,而不是資料庫工具呢?

有的朋友可能不知道數據倉庫,數據倉庫是邏輯上的概念,底層使用的是資料庫,數據倉庫中的數據有這兩個特點:最全的歷史數據(海量)、相對穩定的;所謂相對穩定,指的是數據倉庫不同於業務系統資料庫,數據經常會被更新,數據一旦進入數據倉庫,很少會被更新和刪除,只會被大量查詢。而Hive,也是具備這兩個特點,因此,Hive適合做海量數據的數據倉庫工具,而不是資料庫工具。

了解了它的作用之後,就是安裝配置Hive的環節,當可以正常進入Hive命令行是,就是安裝配置成功了。

了解Hive是怎麼工作的

學會Hive的基本命令:

創建、刪除表;載入數據到表;下載Hive表的數據;

MapRece的原理(還是那個經典的題目,一個10G大小的文件,給定1G大小的內存,如何使用Java程序統計出現次數最多的10個單詞及次數);

HDS讀寫數據的流程;向HDFS中PUT數據;從HDFS中下載數據;

自己會寫簡單的MapRece程序,運行出現問題,知道在哪裡查看日誌;

會寫簡單的Select、Where、group by等SQL語句;

Hive SQL轉換成MapRece的大致流程;

Hive中常見的語句:創建表、刪除表、往表中載入數據、分區、將表中數據下載到本地;

從上面的學習,你已經了解到,HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數據,MapRece是Hadoop提供的分布式計算框架,它可以用來統計和分析HDFS上的海量數據,而Hive則是SQL On Hadoop,Hive提供了SQL介面,開發人員只需要編寫簡單易上手的SQL語句,Hive負責把SQL翻譯成MapRece,提交運行。

此時,你的」大數據平台」是這樣的:那麼問題來了,海量數據如何到HDFS上呢?

第三章:數據採集

把各個數據源的數據採集到Hadoop上。

3.1 HDFS PUT命令

這個在前面你應該已經使用過了。put命令在實際環境中也比較常用,通常配合shell、python等腳本語言來使用。建議熟練掌握。

3.2 HDFS API

HDFS提供了寫數據的API,自己用編程語言將數據寫入HDFS,put命令本身也是使用API。

實際環境中一般自己較少編寫程序使用API來寫數據到HDFS,通常都是使用其他框架封裝好的方法。比如:Hive中的INSERT語句,Spark中的saveAsTextfile等。建議了解原理,會寫Demo。

3.3 Sqoop

Sqoop是一個主要用於Hadoop/Hive與傳統關系型資料庫,Oracle、MySQL、SQLServer等之間進行數據交換的開源框架。就像Hive把SQL翻譯成MapRece一樣,Sqoop把你指定的參數翻譯成MapRece,提交到Hadoop運行,完成Hadoop與其他資料庫之間的數據交換。

自己下載和配置Sqoop(建議先使用Sqoop1,Sqoop2比較復雜)。了解Sqoop常用的配置參數和方法。

使用Sqoop完成從MySQL同步數據到HDFS;使用Sqoop完成從MySQL同步數據到Hive表;如果後續選型確定使用Sqoop作為數據交換工具,那麼建議熟練掌握,否則,了解和會用Demo即可。

3.4 Flume

Flume是一個分布式的海量日誌採集和傳輸框架,因為「採集和傳輸框架」,所以它並不適合關系型資料庫的數據採集和傳輸。Flume可以實時的從網路協議、消息系統、文件系統採集日誌,並傳輸到HDFS上。

因此,如果你的業務有這些數據源的數據,並且需要實時的採集,那麼就應該考慮使用Flume。

下載和配置Flume。使用Flume監控一個不斷追加數據的文件,並將數據傳輸到HDFS;Flume的配置和使用較為復雜,如果你沒有足夠的興趣和耐心,可以先跳過Flume。

3.5 阿里開源的DataX

現在DataX已經是3.0版本,支持很多數據源。

第四章:把Hadoop上的數據搞到別處去

Hive和MapRece進行分析了。那麼接下來的問題是,分析完的結果如何從Hadoop上同步到其他系統和應用中去呢?其實,此處的方法和第三章基本一致的。

HDFS GET命令:把HDFS上的文件GET到本地。需要熟練掌握。

HDFS API:同3.2.

Sqoop:同3.3.使用Sqoop完成將HDFS上的文件同步到MySQL;使用Sqoop完成將Hive表中的數據同步到MySQL。

如果你已經按照流程認真完整的走了一遍,那麼你應該已經具備以下技能和知識點:

知道如何把已有的數據採集到HDFS上,包括離線採集和實時採集;

知道sqoop是HDFS和其他數據源之間的數據交換工具;

知道flume可以用作實時的日誌採集。

從前面的學習,對於大數據平台,你已經掌握的不少的知識和技能,搭建Hadoop集群,把數據採集到Hadoop上,使用Hive和MapRece來分析數據,把分析結果同步到其他數據源。

接下來的問題來了,Hive使用的越來越多,你會發現很多不爽的地方,特別是速度慢,大多情況下,明明我的數據量很小,它都要申請資源,啟動MapRece來執行。

第五章:SQL

其實大家都已經發現Hive後台使用MapRece作為執行引擎,實在是有點慢。因此SQL On Hadoop的框架越來越多,按我的了解,最常用的按照流行度依次為SparkSQL、Impala和Presto.這三種框架基於半內存或者全內存,提供了SQL介面來快速查詢分析Hadoop上的數據。

我們目前使用的是SparkSQL,至於為什麼用SparkSQL,原因大概有以下吧:使用Spark還做了其他事情,不想引入過多的框架;Impala對內存的需求太大,沒有過多資源部署。

5.1 關於Spark和SparkSQL

什麼是Spark,什麼是SparkSQL。

Spark有的核心概念及名詞解釋。

SparkSQL和Spark是什麼關系,SparkSQL和Hive是什麼關系。

SparkSQL為什麼比Hive跑的快。

5.2 如何部署和運行SparkSQL

Spark有哪些部署模式?

如何在Yarn上運行SparkSQL?

使用SparkSQL查詢Hive中的表。Spark不是一門短時間內就能掌握的技術,因此建議在了解了Spark之後,可以先從SparkSQL入手,循序漸進。

關於Spark和SparkSQL,如果你認真完成了上面的學習和實踐,此時,你的」大數據平台」應該是這樣的。

第六章:數據多次利用

請不要被這個名字所誘惑。其實我想說的是數據的一次採集、多次消費。

在實際業務場景下,特別是對於一些監控日誌,想即時的從日誌中了解一些指標(關於實時計算,後面章節會有介紹),這時候,從HDFS上分析就太慢了,盡管是通過Flume採集的,但Flume也不能間隔很短就往HDFS上滾動文件,這樣會導致小文件特別多。

為了滿足數據的一次採集、多次消費的需求,這里要說的便是Kafka。

關於Kafka:什麼是Kafka?Kafka的核心概念及名詞解釋。

如何部署和使用Kafka:使用單機部署Kafka,並成功運行自帶的生產者和消費者例子。使用Java程序自己編寫並運行生產者和消費者程序。Flume和Kafka的集成,使用Flume監控日誌,並將日誌數據實時發送至Kafka。

如果你認真完成了上面的學習和實踐,此時,你的」大數據平台」應該是這樣的。

這時,使用Flume採集的數據,不是直接到HDFS上,而是先到Kafka,Kafka中的數據可以由多個消費者同時消費,其中一個消費者,就是將數據同步到HDFS。

如果你已經認真完整的學習了以上的內容,那麼你應該已經具備以下技能和知識點:

為什麼Spark比MapRece快。

使用SparkSQL代替Hive,更快的運行SQL。

使用Kafka完成數據的一次收集,多次消費架構。

自己可以寫程序完成Kafka的生產者和消費者。

從前面的學習,你已經掌握了大數據平台中的數據採集、數據存儲和計算、數據交換等大部分技能,而這其中的每一步,都需要一個任務(程序)來完成,各個任務之間又存在一定的依賴性,比如,必須等數據採集任務成功完成後,數據計算任務才能開始運行。如果一個任務執行失敗,需要給開發運維人員發送告警,同時需要提供完整的日誌來方便查錯。

第七章:越來越多的分析任務

不僅僅是分析任務,數據採集、數據交換同樣是一個個的任務。這些任務中,有的是定時觸發,有點則需要依賴其他任務來觸發。當平台中有幾百上千個任務需要維護和運行時候,僅僅靠crontab遠遠不夠了,這時便需要一個調度監控系統來完成這件事。調度監控系統是整個數據平台的中樞系統,類似於AppMaster,負責分配和監控任務。

7.1 Apache Oozie

Oozie是什麼?有哪些功能?

Oozie可以調度哪些類型的任務(程序)?

Oozie可以支持哪些任務觸發方式?

安裝配置Oozie。

7.2 其他開源的任務調度系統

Azkaban,light-task-scheler,Zeus,等等。另外,我這邊是之前單獨開發的任務調度與監控系統,具體請參考《大數據平台任務調度與監控系統》。

第八章:我的數據要實時

在第六章介紹Kafka的時候提到了一些需要實時指標的業務場景,實時基本可以分為絕對實時和准實時,絕對實時的延遲要求一般在毫秒級,准實時的延遲要求一般在秒、分鍾級。對於需要絕對實時的業務場景,用的比較多的是Storm,對於其他准實時的業務場景,可以是Storm,也可以是Spark Streaming。當然,如果可以的話,也可以自己寫程序來做。

8.1 Storm

什麼是Storm?有哪些可能的應用場景?

Storm由哪些核心組件構成,各自擔任什麼角色?

Storm的簡單安裝和部署。

自己編寫Demo程序,使用Storm完成實時數據流計算。

8.2 Spark Streaming

什麼是Spark Streaming,它和Spark是什麼關系?

Spark Streaming和Storm比較,各有什麼優缺點?

使用Kafka + Spark Streaming,完成實時計算的Demo程序。

至此,你的大數據平台底層架構已經成型了,其中包括了數據採集、數據存儲與計算(離線和實時)、數據同步、任務調度與監控這幾大模塊。接下來是時候考慮如何更好的對外提供數據了。

第九章:數據要對外

通常對外(業務)提供數據訪問,大體上包含以下方面。


離線:比如,每天將前一天的數據提供到指定的數據源(DB、FILE、FTP)等;離線數據的提供可以採用Sqoop、DataX等離線數據交換工具。

實時:比如,在線網站的推薦系統,需要實時從數據平台中獲取給用戶的推薦數據,這種要求延時非常低(50毫秒以內)。根據延時要求和實時數據的查詢需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。

OLAP分析:OLAP除了要求底層的數據模型比較規范,另外,對查詢的響應速度要求也越來越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的數據模型比較規模,那麼Kylin是最好的選擇。

即席查詢:即席查詢的數據比較隨意,一般很難建立通用的數據模型,因此可能的方案有:Impala、Presto、SparkSQL。

這么多比較成熟的框架和方案,需要結合自己的業務需求及數據平台技術架構,選擇合適的。原則只有一個:越簡單越穩定的,就是最好的。

⑵ hive sql的語法幫助在哪

Hive 是基於Hadoop 構建的一套數據倉庫分析系統,它提供了豐富的SQL查詢方式來分析存儲在Hadoop 分布式文件系統中的數據,可以將結構化的數據文件映射為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapRece任務進行運行,通過自己的SQL 去查詢分析需要的內容,這套SQL 簡稱Hive SQL,使不熟悉maprece 的用戶很方便的利用SQL 語言查詢,匯總,分析數據。而maprece開發人員可以把己寫的mapper 和recer 作為插件來支持Hive 做更復雜的數據分析。
它與關系型資料庫的SQL 略有不同,但支持了絕大多數的語句如DDL、DML 以及常見的聚合函數、連接查詢、條件查詢。HIVE不適合用於聯機online)事務處理,也不提供實時查詢功能。它最適合應用在基於大量不可變數據的批處理作業。
HIVE的特點:可伸縮(在Hadoop的集群上動態的添加設備),可擴展,容錯,輸入格式的鬆散耦合。
Hive 的官方文檔中對查詢語言有了很詳細的描述,請參考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的內容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項。
1. DDL 操作
DDL
?建表
?刪除表
?修改表結構
?創建/刪除視圖
?創建資料庫
?顯示命令
建表:
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 。
創建簡單表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
創建外部表:
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 '';
建分區表
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;
創建表並創建索引欄位ds
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
復制一個空表
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
顯示所有表:
hive> SHOW TABLES;
按正條件(正則表達式)顯示表,
hive> SHOW TABLES '.*s';
修改表結構
?增加分區、刪除分區
?重命名表
?修改列的名字、類型、位置、注釋
?增加/更新列
?增加表的元數據信息
表添加一列 :
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;
增加、刪除分區
?增加
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]
?這個命令可以允許改變列名、數據類型、注釋、列位置或者它們的任意組合
表添加一列 :
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則是表示替換表中所有欄位。
增加表的元數據信息
?ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:
:[property_name = property_value…..]

?用戶可以用這個命令向表中增加metadata
改變表文件格式與組織
?ALTER TABLE table_name SET FILEFORMAT file_format
?ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS

附上出處鏈接:http://blog.itpub.net/26613085/viewspace-1224043/

⑶ 如何用sql來寫動態sql,本文主要是hiveql

動態SQL語句在編譯時,並不知道SQL語句的內容,SQL語句的內容「不確定」,只有在運行時,才建立、解析並執行SQL語句。利用動態SQL,在存儲過程中,可以動態創建表、視圖、觸發器等。
動態SQL主要用在以下兩種場景:
編譯時,無法確定SQL語句的內容
靜態SQL不支持的SQL語句,就比如上面代碼中的create
我們可以看到,靜態SQL在編譯時就已經提前檢查了SQL正確性,以及涉及的資料庫對象和對應的許可權關系,而動態SQL則需要在運行的時候才能判斷,所以,靜態SQL的效率高於動態SQL。說了這么多概念的東西,我們現在就來實際看看如何編寫動態SQL,以及如何運行動態SQL。

⑷ oracleSQL語句轉換為hive識別的SQL語句

把like的部分改為
like concat(p_org_no,'%')

⑸ jdbc連接hive用什麼sql語句

jdbc連接hive用什麼sql語句
一般來說我們對hive的操作都是通過cli來進行,也就是Linux的控制台,但是,這樣做本質上是每個連接都存放一個元數據,各個之間都不相同,

⑹ 以下哪些sql語句在hive中執行可以得到系統當前時間年月日

substring(now(),1,10)
from_unixtime(unix_timestamp,'yyyy-MM-dd')

⑺ hive 怎麼看一個sql語句執行幾個job

通過hive自帶的server2的thrift模式提交的sql可以獲得狀態進度,jdbc方式沒有試過。其實,我們完全可以不使用hive,sql-on-Hadoop的框架有ibm的bigsql,Apache的dirll,impala等都是非常不錯的,都可以替代hive。速度都比hive要快很多。偶理解HIVE只是提供查詢和數據處理功能的(解析HIVEQL語句為MAPRece任務),不負責數據存儲的。數據存儲應該是HBase和HDFS的功能,HBase是KeyValue的存儲方式,適用於固定列查詢的數據,如果查詢方式多樣復雜,感覺應該是使用HDFS存儲,然後使用HIVE進行查詢和處理。

⑻ 求一個hive的sql語句。

有點不太明白你的意思,我只按照我自己的理解說了

一般hive 表應該建立一個以day(每一天,比如day=20141227,代表2014-12-27的數據)作為分區,每一天都存一個分區,這個如果想統計7天的 你可以再shell中得到今天作為變數,然後往前推7天那一天作為變數,這兩個變數就可以寫個sql
select * from tablename where day<=today and day>=sevenbeforeday
如果你想從關系型資料庫中導出七個表到hive,就每一天作為分區

⑼ 如何用數字 取hive表某列值

Hive的insert語句能夠從查詢語句中獲取數據,並同時將數據Load到目標表中。現在假定有一個已有數據的表staged_employees(雇員信息全量表),所屬國家cnty和所屬州st是該表的兩個屬性,我們做個試驗將該表中的數據查詢出來插入到另一個表employees中。

INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '北京')
SELECT * FROM staged_employees se
WHERE se.cnty = '中國' AND se.st = '北京';

由於使用了OVERWRITE關鍵字,目標表中原來相同partition中的所有數據被覆蓋,如果目標表中沒有partition,則整個表會被覆蓋。

如果把OVERWRITE關鍵字刪掉,或者替換成INTO,則hive會追加而不是替代原分區或原表中的數據,這個特性在Hive v0.8.0之後才支持。

當數據已經存在於hdfs上但不是我們想要的格式的時候,當進行的計算需要分好多步驟有必要存儲中間數據的時候,或者原數據沒有分區、有很多無效列需要過濾的時候,可以使用insert..select句型來完成這一轉換過程。

由於一個國家有很多個省份,如果想根據(國家country,地區partition)兩個維度對數據進行分區的話,這條SQL語句的執行個數應該等於地區的數目,比如中國有23個省就要對該SQL語句執行23次。因此hive對這個SQL語句進行了改造,只需要掃描一次原表就可以生成不同的輸出(多路輸出)。比如下面的SQL語句掃描了一次原始數據表,但是同時生成了3個省份的結果數據:

FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '河北省')
SELECT * WHERE se.cnty = '中國' AND se.st = '河北省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '陝西省')
SELECT * WHERE se.cnty = '中國' AND se.st = '陝西省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '河南省')
SELECT * WHERE se.cnty = 'US' AND se.st = '河南省';通過縮進可以很清楚的看到,我們掃描了一次staged_employees表但是執行了3次不同的insert語句,這條大SQL語句是這么執行的:先通過from staged_employees表獲取一條記錄,然後執行每一個select子句,如果select子句驗證通過則執行相應的insert語句。注意這里的三條select子句是完全獨立執行的,並不是if .. then .. else的關系,這就意味著這3條select子句在某種情況下可能同時通過where檢測。

通過這種結構,原始表的數據能被拆分到目標表的不同partition中去。

如果原表的一條記錄滿足於其中一個給定的select .. where .. 子句,則該記錄將被寫到目標表的固定分區中。其實更進一步,每條Insert語句能將數據寫到不同的數據表中,不管這個表是否分區都一樣。

於是,就像一個過濾器一樣,原表的一些數據被寫到了很多輸出地址,而剩下的數據會被丟棄。

當然,你也可以混用Insert overwrite和insert into兩種不同的方法寫出數據。

向動態分區插入數據

但是問題還是沒有解決,中國有23個省,那麼我們就需要寫23個insert into .. select ..where子句,這非常不現實。於是hive的一種叫做動態分區的特性就出現了,它能夠根據select出來的參數自動推斷將數據插入到那個分區中去。本文上面的兩種SQL語句設定分區的方式都叫做靜態分區插入。

將上一個SQL語句進行改動,會得到以下簡潔的新SQL語句:

INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;hive先獲取select的最後兩個位置的se.cnty和se.st參數值,然後將這兩個值填寫到Insert語句partition中的兩個country和state變數中,即動態分區是通過位置來對應分區值的。原始表select出來的值和輸出partition的值的關系僅僅是通過位置來確定的,和名字並沒有關系,比如這里se.cnty和county的名稱完全沒有關系。

上面的這條SQL語句是對兩個分區同時進行了動態設定,如果staged_employees表中有100個國家,每個國家有100個地區,那麼該SQL語句自動對每個國家和地區建立相應的partition並插入數據,如果用手寫的話不現實。

只要位置正確,你可以混用動態分區和靜態分區值設定,比如下面這個例子,你可以靜態指定一個country值,但是state值採用動態的方法設定:

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';注意:靜態分區值必須在動態分區值的前面!

⑽ hive 分頁sql語句

分頁實現的方式比較多了 下面舉個例子 比如 獲取前10條數據
註:同時需要記錄這10條中最大的id為preId,作為下一頁的條件。
select * from table order by id asc limit 10;
select * from table where id >preId order by id asc limit 10;