Hive SQL 快速入門指南

在大數據蓬勃發展的當下,處理海量數據成為企業面臨的關鍵挑戰。Hive SQL 作為一款強大的工具,為我們打開了高效處理大數據的大門。接下來,讓我們一起踏上 Hive SQL 的入門之旅。?

一、Hive SQL 是什么?

Hive 是基于 Hadoop 的數據倉庫工具,它允許我們使用類似 SQL 的語法來查詢和分析存儲在 Hadoop 分布式文件系統(HDFS)中的數據。與傳統數據庫不同,Hive 將我們編寫的 SQL 語句轉換為 MapReduce、Tez 或 Spark 任務在 Hadoop 集群上執行,這使得它非常適合處理大規模的離線批量數據。?

Hive 的優勢十分顯著:?

  1. 兼容性佳:支持標準 SQL 語法,對于熟悉 SQL 的開發者而言,幾乎沒有學習成本,能輕松上手。?
  1. 擴展性強:依托 Hadoop 集群,可輕松擴展以處理 PB 級別的海量數據,滿足企業數據量不斷增長的需求。?
  1. 靈活性高:支持多種存儲格式,如 TextFile、ORC、Parquet 等,我們可以根據數據特點和業務需求選擇最合適的存儲方式。?
  1. 生態集成好:能與 Hadoop 生態系統中的其他組件,如 Spark、Pig、Flume 等無縫對接,為大數據處理提供了豐富的技術組合。?

架構解析?

Hive 的架構由多個關鍵組件構成:?

  1. 元數據存儲(Metastore):負責存儲數據庫、表、分區等元數據信息。默認情況下,Hive 使用 Derby 數據庫存儲元數據,但在生產環境中,通常推薦使用 MySQL,因為它具有更好的性能和多用戶支持能力。?
  2. 執行引擎:Hive 支持多種執行引擎,如 MapReduce、Tez 和 Spark。不同的執行引擎在性能和適用場景上有所差異,我們可以根據實際需求進行選擇。例如,MapReduce 是 Hive 最早支持的執行引擎,成熟穩定,但在一些復雜查詢場景下性能可能欠佳;Tez 則對 MapReduce 進行了優化,減少了中間數據的磁盤讀寫,提升了執行效率;Spark 作為內存計算框架,在處理迭代式算法和交互式查詢時表現出色。?
  3. 解析器:其作用是將我們編寫的 SQL 語句轉換為抽象語法樹(AST)。這一步驟類似于編譯器對代碼的詞法和語法分析,確保 SQL 語句的語法正確,并為后續的編譯和優化做準備。
  4. ?優化器:對邏輯查詢計劃進行優化,生成更高效的物理查詢計劃。優化器會考慮多種因素,如數據分布、表的大小、查詢條件等,通過重寫查詢語句、選擇合適的連接算法等方式,提升查詢的執行效率。?

二、基礎語法詳解?

數據庫操作?

在 Hive 中,數據庫就像是一個命名空間,用于組織和管理表。創建數據庫時,我們可以指定其存儲路徑和一些元數據屬性。?

1.創建數據庫:

CREATE DATABASE IF NOT EXISTS my_database;

這里的IF NOT EXISTS子句是一個貼心的設計,它可以避免在數據庫已存在時創建失敗報錯,確保腳本的穩定性。?

2. 查看數據庫詳細信息:

DESCRIBE DATABASE my_database;

這條語句能讓我們了解數據庫的基本信息,如創建時間、所有者等。若想獲取更詳細的信息,可使用DESCRIBE DATABASE EXTENDED my_database;,它會展示數據庫的屬性、存儲位置等更多細節。?

3. 使用數據庫:

USE my_database;

使用USE語句指定當前操作的數據庫,后續的表操作等都會在這個數據庫下進行。?

4. 刪除數據庫:

DROP DATABASE IF EXISTS my_database;

同樣,IF NOT EXISTS子句用于避免刪除不存在的數據庫時出錯。若數據庫不為空,直接使用DROP DATABASE會報錯,此時需要使用DROP DATABASE my_database CASCADE;來強制刪除數據庫及其下的所有表和數據。?

表操作?

  1. 內部表(Managed Table)與外部表(External Table):這兩種表在數據管理上有著本質區別。?
  • 創建內部表:
CREATE TABLE my_table (id INT,name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  • 在這個例子中,我們創建了一個名為my_table的內部表,它有兩個字段id(整數類型)和name(字符串類型)。ROW FORMAT DELIMITED FIELDS TERMINATED BY ','指定了數據行的格式,字段之間以逗號分隔;STORED AS TEXTFILE表示數據以文本文件的形式存儲在 HDFS 上。當我們刪除內部表時,表的數據和元數據都會被刪除。?

  • 創建外部表:
CREATE EXTERNAL TABLE my_external_table (id INT,name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/path/to/external/data';
  • 外部表的創建與內部表類似,但多了一個LOCATION參數,用于指定數據在 HDFS 上的實際存儲路徑。刪除外部表時,只會刪除表的元數據,數據仍會保留在指定的 HDFS 路徑上,這在共享數據或數據需要被其他系統復用的場景中非常有用。?

    2. 分區表與分桶表:這是 Hive 提升查詢性能的重要機制。?

  • 創建分區表:
CREATE TABLE sales (product_id INT,amount DECIMAL(10, 2)
)
PARTITIONED BY (sale_date STRING, region STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  • 上述代碼創建了一個按銷售日期sale_date和地區region分區的sales表。分區表將數據按分區字段存儲在不同的目錄下,例如,對于sale_date='2024-01-01', region='North'的數據,可能存儲在/user/hive/warehouse/sales/sale_date=2024-01-01/region=North/目錄中。當我們查詢特定分區的數據時,Hive 只需掃描相關分區的目錄,大大減少了數據掃描范圍,提升了查詢效率。?

  • 創建分桶表:
CREATE TABLE users (user_id INT,username STRING
)
CLUSTERED BY (user_id) INTO 10 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;
  • 這里創建了一個按user_id分桶的users表,將數據分成 10 個桶。分桶通過哈希函數將數據分散到多個文件中,在進行 JOIN 操作時,如果兩個表基于相同的分桶字段進行分桶,且桶數相同,Hive 可以直接在對應的桶之間進行 JOIN,避免了全表掃描和大量數據的 Shuffle 操作,從而顯著提升 JOIN 性能。在實際應用中,通常建議采用復合分區(如年 / 月 / 日)加分桶(桶數設置為集群節點數的 2 倍左右)的方式,進一步優化查詢性能。?

    3. 修改表結構:隨著業務的發展,我們可能需要對已有的表結構進行修改。?

  • 添加列:
ALTER TABLE my_table ADD COLUMNS (new_column INT);
  • 這條語句在my_table表中添加了一個名為new_column的整數類型列。?

  • 修改列名和數據類型:
ALTER TABLE my_table CHANGE COLUMN old_column new_column_name DOUBLE;
  • 該語句將my_table表中的old_column列名修改為new_column_name,并將其數據類型從原來的類型改為DOUBLE。?

  • 重命名表:
ALTER TABLE my_table RENAME TO new_table_name;
  • 通過這條語句,我們可以輕松將my_table重命名為new_table_name。?

    4. 刪除表:當某個表不再需要時,可以使用以下語句刪除:

DROP TABLE IF EXISTS my_table;
  • IF EXISTS同樣用于避免刪除不存在的表時出錯。?

    數據插入與加載?

    Hive 提供了多種數據導入方式,每種方式在性能和適用場景上各有不同。?

  • 從本地文件系統加載數據:這是一種較為常用且快速的方式。
LOAD DATA LOCAL INPATH '/path/to/local/file.csv' INTO TABLE my_table;

該語句將本地文件系統中的file.csv文件數據加載到 Hive 的my_table表中。數據加載后,源文件會被移動到 Hive 表的數據存儲目錄下(對于內部表)。如果不想移動源文件,而是復制數據,可以使用COPY FROM LOCAL語法(在某些 Hive 版本中支持)。?

2. 從 HDFS 加載數據:

LOAD DATA INPATH '/path/to/hdfs/file.csv' INTO TABLE my_table;

此方式用于將 HDFS 上指定路徑的文件數據加載到my_table表中,數據加載后,源文件同樣會被移動到 Hive 表的數據存儲目錄(內部表情況)。?

3. 從查詢結果插入數據:當我們需要根據已有表的查詢結果插入到另一個表時,可以使用這種方式。

INSERT INTO TABLE new_table
SELECT column1, column2
FROM old_table
WHERE condition;

上述代碼從old_table中查詢符合condition條件的column1和column2列數據,并插入到new_table表中。如果new_table是分區表,還可以指定插入到特定分區:

INSERT INTO TABLE new_table PARTITION (partition_column='value')
SELECT column1, column2
FROM old_table
WHERE condition;

動態分區插入:在某些情況下,我們可能不知道具體要插入哪些分區,這時可以使用動態分區插入。

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;INSERT INTO TABLE new_table PARTITION (partition_column)
SELECT column1, column2, partition_value
FROM old_table
WHERE condition;

這里通過設置兩個 Hive 參數開啟動態分區功能,hive.exec.dynamic.partition=true表示啟用動態分區,hive.exec.dynamic.partition.mode=nonstrict表示非嚴格模式(在嚴格模式下,至少需要一個靜態分區)。查詢結果中的partition_value會根據partition_column自動確定插入到哪個分區。?

查詢語句?

查詢是我們使用 Hive SQL 的核心操作,通過查詢從海量數據中獲取有價值的信息。?

基本查詢:Hive 的基本查詢語法與傳統 SQL 類似。

SELECT column1, column2
FROM my_table
WHERE condition
ORDER BY column1 DESC
LIMIT 100;

這條語句從my_table表中選擇column1和column2列,篩選出滿足condition條件的數據,然后按column1列降序排序,最后只返回前 100 條數據。在編寫查詢時,有一些性能優化技巧:?

  • 過濾條件前置:盡量將過濾條件寫在WHERE子句中,讓 Hive 盡早減少數據量,避免后續不必要的數據處理。例如,SELECT * FROM my_table WHERE date='2024-01-01' AND amount > 100;,先根據日期和金額條件過濾數據,再進行其他操作。?
  • 使用列裁剪:避免使用SELECT *,只選擇需要的列,減少數據傳輸和處理開銷。比如,只需要id和name列時,應寫為SELECT id, name FROM my_table;。?
  • 連接查詢:在處理多個相關表的數據時,需要使用連接查詢。?
  • 內連接(INNER JOIN):
SELECT a.column1, b.column2
FROM table_a a
INNER JOIN table_b b ON a.common_column = b.common_column;

內連接只返回兩個表中滿足連接條件的行。例如,table_a和table_b通過common_column列進行連接,只有當table_a和table_b中都存在common_column值相同的行時,才會出現在結果集中。?

  • 左外連接(LEFT OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
LEFT OUTER JOIN table_b b ON a.common_column = b.common_column;

左外連接會返回左表(table_a)中的所有行,以及右表(table_b)中滿足連接條件的行。如果右表中沒有匹配的行,則對應列的值為NULL。?

  • 右外連接(RIGHT OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
RIGHT OUTER JOIN table_b b ON a.common_column = b.common_column;

右外連接與左外連接相反,返回右表中的所有行,以及左表中滿足連接條件的行,左表中無匹配行時對應列值為NULL。?

  • 全外連接(FULL OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
FULL OUTER JOIN table_b b ON a.common_column = b.common_column;

全外連接返回兩個表中的所有行,當某表中沒有匹配行時,對應列的值為NULL。?

3. 子查詢:在查詢中嵌套另一個查詢,稱為子查詢。

SELECT column1
FROM my_table
WHERE column2 IN (SELECT column3FROM another_tableWHERE condition
);

這條語句先在another_table表中根據condition條件查詢出column3的值,然后在my_table表中篩選出column2值在子查詢結果中的行,并返回column1列。?

4. 窗口函數:窗口函數是 Hive SQL 的強大功能之一,適用于排名、累計計算等復雜場景。?

  • 計算用戶訂單金額排名:
SELECT user_id,order_id,amount,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rank
FROM order_info;

這里使用ROW_NUMBER()窗口函數,在每個user_id分區內,按amount降序對訂單進行排名,生成rank列。?

  • 計算移動平均:
SELECT dt,region,amount,AVG(amount) OVER (PARTITION BY region ORDER BY dt RANGE BETWEEN 7 PRECEDING AND CURRENT ROW) AS rolling_7d_avg
FROM daily_sales;

該語句計算每個地區region按日期dt的 7 天移動平均銷售額。AVG(amount) OVER (...)表示在region分區內,按日期順序,計算當前行及前 7 行的平均銷售額。?

常見的窗口函數包括:?

  • 排序函數:ROW_NUMBER()(生成唯一的行號)、RANK()(排名,相同值會占用相同排名,下一個排名會跳過)、DENSE_RANK()(排名,相同值會占用相同排名,下一個排名不跳過)。?
  • 聚合函數:SUM()(求和)、AVG()(求平均)、MIN()(求最小值)、MAX()(求最大值)等在窗口函數中可用于計算指定窗口范圍內的聚合結果。?
  • 分析函數:LEAD()(獲取下一行的值)、LAG()(獲取上一行的值)、FIRST_VALUE()(獲取窗口內第一行的值)、LAST_VALUE()(獲取窗口內最后一行的值)等,用于在窗口內進行數據的前后分析。?
  • 聚合函數與 GROUP BY:聚合函數用于對一組數據進行統計計算,通常與GROUP BY子句一起使用。
SELECT user_id,COUNT(order_id) AS order_count,SUM(amount) AS total_amount
FROM order_info
GROUP BY user_id;

上述代碼按user_id分組,統計每個用戶的訂單數量order_count和總金額total_amount。

以上就是本次初步的一個Hive使用分享,主要是本人因為一些學習上的需要也是正在開始接觸Hive相關內容,接觸下來了解到其實就是為了方便SQL語言編程者,所以如果有一定的SQL經驗上手會更容易,但整體其實也不是那么復雜,也有可能是我剛開始學的問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912385.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國內公司把數據湖做成了數據庫

在做多年的數據倉庫項目,數據湖也在做,但是做完發現,這個不是傳統數據庫里面的ODS嗎? 好多公司做數據湖,就是把數據湖做成了ODS層(貼源數據層),難道真的數據湖就是這樣等于ODS嗎&am…

Python 數據分析與可視化 Day 6 - 可視化整合報告實戰

🎯 今日目標 整合數據分析與可視化結果生成結構化報告用代碼自動生成完整的圖文分析文檔熟悉 Jupyter Notebook / Markdown 圖表 報告生成流程 🧩 一、項目背景:學生成績分析報告 數據來源:students_cleaned.csv(含姓…

服務器、樹莓派/香橙派部署HomeAssistant與小愛音箱聯動

HomeAssistant功能介紹與多平臺部署實戰:CentOS服務器、樹莓派、香橙派部署及小愛音箱聯動控制 一、HomeAssistant簡介 HomeAssistant是一款基于Python開發的開源智能家居自動化平臺,它最大的特點是高度集成和自定義。通過HomeAssistant,用…

內存泄漏系列專題分析之二十四:內存泄漏測試Camera相機進程內存指標分布report概述

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 內存泄漏系列專題分析之二十四:內存泄漏測試Camera相機進程內存指標分布report概述 目錄 一、問題背景 二、:內存泄漏測試Camera相機進程內存指標分布report概述 2.1:Camera領域相機進…

華為堆疊理論及配置

一,堆疊基本概念 1.1交換機角色 主交換機(Master):主交換機負責管理整個堆疊。**堆疊系統中只有一臺主交換機。**備交換機(Standby):備交換機是主交換機的備份交換機。堆疊系統中只有一臺備交換…

【數字經濟】數據即產品架構在數字經濟時代的應用

數據即產品架構在數字經濟時代的應用 在數字經濟中,數據已成為核心生產要素,“數據即產品”(Data-as-a-Product)架構通過系統化封裝原始數據,實現其可交易、可交付的產品化價值。以下是其架構設計與應用解析&#xff…

MySQL 中的時間序列數據分析與處理

在互聯網應用和企業業務系統中,特別是現在當下環境電商以及跨境電商火爆的情況下,時間序列數據無處不在,如電商訂單時間、用戶登錄日志、設備監控數據等。MySQL 作為主流數據庫,具備強大的時間序列數據處理能力。本文將結合電商訂…

STM32——MDK5編譯和串口下載程序+啟動模式

一、MDK5編譯 1.1 編譯中間文件 還可通過 .map文件計算程序大小 中間文件 > 下載到開發板中的文件 > .hex 二、串口下載 2.1 前提須知 2.2 串口硬件鏈接(M3、M4系列) M7無串口下載 PC端需安裝 CH340 USB 虛擬串口驅動:CH340 USB 虛…

HyperWorks仿真案例:拓撲優化與激光增材制造的完美結合挖掘輕量化結構的新潛力

許多技術創新都基于自然界中生物結構的設計。通過不斷進化,大自然在數百萬年間已學會根據各種形狀的功能對形狀進行調整,從而最大程度地提高效率。當工程師設法構建堅固而輕盈的結構時,這些自然界中的示例可以提供重要線索。在目前的研究項目…

在Windows系統部署本地智能問答系統:基于百度云API完整教程

引言 在人工智能時代,搭建私有化智能問答系統能有效保護數據隱私并提升響應效率。本教程將手把手教你在Windows環境中,通過百度云API構建專屬智能問答系統,全程無需服務器,僅需本地計算機即可運行! 一、環境準備 系統…

Vue的watch函數實現

<script setup> import { watch, ref, reactive, toRefs } from vue;const count ref(0); const obj reactive({name: 張三,age: 18 });// 我們可以使用toRefs&#xff0c;將reactive對象中的屬性轉換為ref對象&#xff0c;保持響應性&#xff01;&#xff01; const {…

Tomcat 安裝使用教程

&#x1f4cc; 什么是 Tomcat&#xff1f; Apache Tomcat 是一個開源的 Java Servlet 容器&#xff0c;也是運行 Java Web 應用最常用的服務器之一&#xff0c;支持 Servlet、JSP 等規范。 &#x1f9f0; 一、準備工作 1. 系統要求 操作系統&#xff1a;Windows / Linux / m…

【邀請】點擊邀請鏈接參加阿里云訓練營活動,完成學習送禮品+戶外折疊凳,一個小時就能完成

點擊邀請鏈接參加阿里云訓練營活動&#xff0c;完成學習送禮品戶外折疊凳&#xff0c;快的話一個小時就能完成。 7月28日23:59前完成。 OSS進階應用與成本優化訓練營 禮品如下&#xff1a; 包尖鋼筆/祈福小神仙積木/雨傘/不銹鋼餐具隨機發放 戶外折疊凳

用戶行為序列建模(篇六)-【阿里】DSIN

簡介 DSIN&#xff08;Deep Session Interest Network&#xff09;是阿里巴巴于2019年提出的點擊率預估模型。相比于DIN、DIEN&#xff0c;考慮了用戶行為序列的內在結構&#xff08;序列是由session組成的&#xff0c;在每個session內&#xff0c;用戶行為是高度同構的&#…

現代Web表情選擇器組件:分類系統與實現詳解

你好呀&#xff0c;我是小鄒。今天給博客的emoji表情進行了歸類、補充&#xff0c;具體優化如下。 表情選擇器的核心價值在于其分類系統。本文將深入解析表情分類體系的設計與實現&#xff0c;通過完整代碼示例展示如何構建一個專業級的表情選擇器組件。 一、表情分類系統設計…

華為云Flexus+DeepSeek征文 |華為云ModelArts Studio集成OpenAI Translator:開啟桌面級AI翻譯新時代

華為云FlexusDeepSeek征文 |華為云ModelArts Studio集成OpenAI Translator&#xff1a;開啟桌面級AI翻譯新時代 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、OpenAI Translator介紹openai-translator簡介openai-translator主要特…

GitHub 趨勢日報 (2025年06月27日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 817 twenty 655 awesome 476 free-for-dev 440 Best-websites-a-programmer-shoul…

Java語法通關秘籍:this、構造方法到String核心精粹

文章目錄 &#x1f50d; **一、就近原則與this關鍵字**1. **成員變量**2. **局部變量** &#x1f6e0;? **二、構造方法&#xff08;構造器&#xff09;**1. **標準格式**2. **有參構造實戰**3. **靈魂三問** ? &#x1f4e6; **三、JavaBean黃金標準**&#x1f9e0; **四、對…

@Cacheable 等緩存注解是不是也用到了 AOP?

Spring 的聲明式緩存注解&#xff08;Cacheable, CachePut, CacheEvict 等&#xff09;是 AOP 技術在實際應用中最強大、最經典的范例之一&#xff0c;其原理與 Transactional 非常相似。 核心思想&#xff1a;一個智能的“秘書” 你可以把 Cacheable 的 AOP 實現想象成一個極…

解鎖云原生微服務架構:搭建與部署實戰全攻略

目錄 一、引言二、微服務拆分2.1 拆分的必要性2.2 拆分方法2.3 注意事項 三、服務注冊與發現3.1 概念與原理3.2 常用組件介紹3.3 實踐案例 四、負載均衡4.1 作用與原理4.2 實現方式4.3 負載均衡算法4.4 案例與代碼實現4.4.1 項目依賴配置4.4.2 配置 Ribbon4.4.3 代碼實現負載均…