文章目錄
- 1.Hive 簡介
- 2.Hive 與 SQL 標準和主流 SQL DB 的語法區別
- 參考文獻
1.Hive 簡介
Hive是一種基于Hadoop的數據倉庫軟件,可以將結構化數據文件映射為一張數據庫表,并提供了類SQL查詢接口,使得用戶可以使用SQL類語言來查詢數據。Hive可以處理包括文本、CSV、JSON、ORC和Parquet等格式的數據文件,支持數據的導入、導出、轉換等操作。Hive可以在Hadoop集群上運行,利用Hadoop的分布式計算能力,可以處理大規模的數據集。
Hive基于Hadoop MapReduce進行計算,并提供了用于數據處理和分析的一系列工具和庫,例如HiveQL(類SQL查詢語言)、UDF(用戶自定義函數)、HiveServer、Hive Metastore等。HiveQL類SQL查詢語言支持大多數標準SQL操作,如SELECT、JOIN、GROUP BY、HAVING、ORDER BY等,同時還支持自定義函數和自定義聚合函數。
Hive還支持數據倉庫中常見的分區、分桶、索引等特性,可以提高查詢性能和數據管理效率。Hive可以與其他大數據工具和框架進行集成,例如Hadoop、HBase、Spark、Pig等,可以方便地進行數據處理和分析。
總之,Hive是一個強大的數據倉庫工具,提供了方便的SQL查詢接口和大規模數據處理能力,可以幫助用戶快速構建和管理數據倉庫,進行數據分析和挖掘。
2.Hive 與 SQL 標準和主流 SQL DB 的語法區別
(1)Hive 通過 SELECT 進行 INSERT INTO TABLE 時,無法指定待插入的列。
這是因為 Hive SQL 中的 INSERT 子句是按照列的位置順序進行插入的,而不是按照列名進行插入的,并且要插入全部字段。
這與 SQL 標準語法有所差異。比如 MySQL 在 INSERT 時可以指定目標表的列。
解決辦法是嚴格保證 INSERT 語句中的字段和建表語句中的字段的順序一致,如果沒有則顯示指定缺省值。
比如源表 source_table 列如下:
CREATE TABLE source_table (a STRING,b STRING,c STRING
);
目標表 target_table 定義如下:
CREATE TABLE target_table (a STRING,b STRING,c STRING
);
如果從 source_table 查詢 a 和 c 插入到 target_table,插入時指定列名將報錯:
INSERT OVERWRITE TABLE target_table(a, c)
SELECT a, c FROM source_table;
應該是:
INSERT OVERWRITE TABLE target_table
SELECT a, NULL, c FROM source_table;
(2)Hive 中不能將列別名用于 GROUP BY 子句。
在 Hive 中,不能在 GROUP BY 子句中使用列別名,只能使用原始列名。這是因為在查詢執行順序中,GROUP BY 子句是在列別名之后執行的,因此無法識別別名。
假設有一個表 my_table 包含兩個列 col1 和 col2,其中 col1 的值為 ‘A’ 或 ‘B’,col2 的值為整數。現在需要按照 col1 列的值進行分組,并計算每組中 col2 的平均值。以下是一個錯誤的查詢語句:
SELECT col1 AS my_col, AVG(col2) as avg_col
FROM my_table
GROUP BY my_col;
正確的語句應該是:
SELECT col1, AVG(col2) as avg_col
FROM my_table
GROUP BY col1;
SQL 標準GROUP BY 子句中不允許使用列別名,只能使用原始列名。這與 HiveSQL 中的規則相同。
MySQL 在某些情況下支持使用列別名,但是這并不是標準行為。具體而言,如果使用的是 MySQL 5.7.5 或更高版本,并且在 SELECT 子句中使用了列別名,則可以在 GROUP BY 子句和 ORDER BY 子句中使用相同的別名。例如:
SELECT col1 + col2 AS my_col, COUNT(*)
FROM my_table
GROUP BY my_col
ORDER BY my_col DESC;
(3)Hive 子查詢一定要設置別名。
Hive 即使不需要對子查詢進行引用,也要設置別名。
在 SQL 標準中,并沒有強制規定子查詢一定要設置別名。不同的數據庫實現可能會有不同的規定。但是,大多數數據庫實現都要求子查詢設置別名,比如 MySQL、SQL Server 和 PostgreSQL。
而在 Oracle 中是可以不加別名。
SELECT * FROM (SELECT * FROM t);
(4)關于窗口函數。
Hive 對窗口函數的支持比較早,自 Hive 0.11 版本便開始支持窗口函數。
而 MySQL 從 8.0 版本才開始支持窗口函數。
窗口函數是一種基于窗口(Window)的計算方式,可以對數據集中的一個子集(稱為窗口)進行聚合、排序、排名等操作,同時不影響原始數據集中的數據。
通常的窗口函數的語法如下:
function_name(expression) OVER ([PARTITION BY partition_expression, ... ][ORDER BY sort_expression [ASC | DESC], ... ][ROWS | RANGE frame_specification]
)
其中,function_name(expression) 表示要進行計算的窗口函數和參數;PARTITION BY 子句用于對數據進行分組,確定窗口的大小;ORDER BY 子句用于對數據進行排序,確定窗口的位置;ROWS 或者 RANGE 用于指定窗口的類型;frame_specification 用于進一步指定窗口的大小和位置。
需要注意的是,不同的數據庫實現對于窗口函數語法的支持和細節可能會有所不同,實際使用中需要查看所使用的數據庫實現的文檔,以了解其具體的語法和使用方式。
參考文獻
LanguageManual - Apache Hive
MySQL 8.0 Reference Manual :: 14.20 Window Functions