hive 语法检查_升级Hive3处理语义和语法变更
由于在CDH或HDP中運行的Hive的早期版本與CDP中的Hive 3之間的語義變化,您需要執行許多與遷移相關的更改。Hive 3中與db.table引用和DROP CASCADE相關的一些語法更改可能需要對應用程序進行更改。
轉換時間戳
將數字轉換為時間戳的應用程序的結果從Hive 2到Hive 3有所不同。ApacheHive更改了CAST的行為以符合SQL標準,該標準不將時區與TIMESTAMP類型相關聯。
升級到CDP之前
將數字類型值強制轉換為時間戳可用于生成反映集群時區的結果。例如,1597217764557是2020-08-12 PDT。運行以下查詢將數字轉換為PDT中的時間戳:
> SELECT CAST(1597217764557 AS TIMESTAMP);| 2020-08-12 00:36:04 |升級到CDP之后
將數字類型值轉換為時間戳會產生反映UTC而不是集群時區的結果。運行以下查詢將數字強制轉換為UTC中的時間戳。
> SELECT CAST(1597217764557 AS TIMESTAMP);| 2020-08-12 07:36:04.557 |需要采取的行動
更改應用程序。不要通過數字強制轉換來獲取本地時區。內置函數from_utc_timestamp和to_utc_timestamp可用于模擬升級前的行為。
檢查字段變更的兼容性
默認配置更改可能導致更改列類型的應用程序失敗。
升級到CDP之前
在HDP 2.x中hive.metastore.disallow.incompatible.col.type.changes默認值是false,阻止Hive不兼容的字段類型的變更。例如,您可以將STRING列更改為不兼容類型的列,例如MAP 。沒有錯誤發生。
升級到CDP之后
在CDP中,hive.metastore.disallow.incompatible.col.type.changes默認值為true。配置單元可防止更改不兼容的列類型。不會阻止兼容的列類型更改,例如INT,STRING,BIGINT。
需要采取的行動
更改應用程序以禁止不兼容的字段類型更改,以防止可能的數據損壞。檢查ALTER TABLE語句,并更改由于不兼容的列類型而失敗的語句。
創建表
為了提高可用性和功能,Hive 3在建表上做了重大變更。
Hive通過以下方式更改了表的創建:
創建兼容ACID的表,這是CDP中的默認表
支持簡單的寫入和插入
寫入到多個分區
在單個SELECT語句中插入多個數據更新
消除了分桶的需求。
如果您具有在Hive中創建表的ETL管道,則這些表將被創建為ACID。Hive現在嚴格控制訪問并定期在表上執行壓縮。從Spark和其他客戶端訪問托管Hive表的方式發生了變化。在CDP中,對外部表的訪問要求您設置安全訪問權限。
升級到CDP之前
在CDH和HDP 2.6.5中,默認情況下CREATE TABLE創建了一個非ACID表。
升級到CDP之后
在CDP中,默認情況下,CREATE TABLE以ORC格式創建完整的ACID事務表。
需要采取的行動
執行以下一項或多項操作:
升級過程會將CDH中的Hive托管表轉換為外部表。您必須更改腳本以創建用例所需的表類型。
配置舊的CREATE TABLE行為以默認創建外部表。
要從Spark讀取Hive ACID表,請使用Hive Warehouse Connector(HWC)或HWC Spark Direct Reader連接到Hive。要從Spark寫入Hive ACID表,請使用HWC和HWC API。當您不使用HWC API時,Spark將使用purge屬性創建一個外部表。
為表設置Ranger策略和HDFS ACL。
更正查詢中的`db.table`
為了符合ANSI SQL,Hive 3.x拒絕SQL查詢中的`db.table`?。表名中不允許使用點(.)。
您需要更改使用此類`db.table`?引用的查詢,以防止Hive將整個db.table字符串解釋為表名。您將數據庫名稱和表名稱括在反引號中。
向表引用添加反引號
CDP包含Hive-16907錯誤修復程序,該錯誤修復程序拒絕SQL查詢中的`db.table`?。表名中不允許使用點(.)。您需要更改使用此類引用的查詢,以防止Hive將整個db.table字符串解釋為表名。
查找具有問題表引用的表。
math.students出現在CREATE TABLE語句中。
將數據庫名稱和表名稱括在反引號中。
CREATE TABLE `math`.`students` (name VARCHAR(64), age INT, gpa DECIMAL(3,2));處理關鍵字APPLICATION
如果在查詢中使用關鍵字APPLICATION,則可能需要修改查詢以防止失敗。
為防止使用關鍵字的查詢失敗,請將查詢括在反引號中。
升級到CDP之前
在CDH版本(例如CDH 5.13)中,在查詢中使用單詞APPLICATION的查詢將成功執行。例如,您可以將此詞用作表名。
> select f1, f2 from application升級到CDP之后
使用關鍵字APPLICATION的查詢失敗。
需要采取的行動
更改應用程序。將查詢括在反引號中。
SELECT field1, field2 FROM `application`;禁用分區類型檢查
Hive 3中的一項增強功能可以檢查分區的類型。可以通過設置屬性來禁用此功能。
升級到CDP之前
在CDH 5.x中,不對分區值進行類型檢查。
升級到CDP之后
如果屬性hive.typecheck.on.insert設置為true(默認值),則對分區規范中指定的分區值進行類型檢查,轉換和規范化以符合其列類型?。值可以是數字。
需要采取的行動
如果分區的類型檢查導致問題,請禁用該功能。要禁用分區類型檢查,請設置hive.typecheck.on.insert為false。例如:
SET hive.typecheck.on.insert=false;刪除分區
CASCADE子句中用于刪除分區的OFFLINE和NO_DROP關鍵字會導致性能問題,不再受支持。
升級到CDP之前
您可以在DROP CASCADE子句中使用OFFLINE和NO_DROP關鍵字來防止讀取或刪除分區。
升級到CDP之后
DROP CASCADE子句不支持OFFLINE和NO_DROP。
需要采取的行動
更改應用程序以從DROP CASCADE子句中刪除OFFLINE和NO_DROP。使用授權方案,例如Ranger,以防止刪除或讀取分區。
向角色授予權限
在CDH中的ROLE / GROUP語義與CDP中的那些語義不同。Hive 3需要嚴格控制的文件系統和計算機內存資源,以替代早期Hive版本允許的靈活邊界。
明確的邊界增加了可預測性。更好的文件系統控制可提高安全性。該模型提供比其他安全方案更強的安全性和更好的策略管理。
升級到CDP之前
在CDH中,建議將Sentry用于CDH政策管理。CDH支持GRANT ON ROLE語義。
升級到CDP之后
Hive 3中的主要授權模型是Ranger,而不是Sentry。如果要從CDH遷移,請從Sentry移至Apache Ranger。不支持GRANT ON ROLE語義。
需要采取的行動
例如,使用CDP支持的GRANT語義來設置文件系統權限:
GRANT ON TABLE
使用配置基于資源的策略:配置單元中描述的語義。
處理最大和最小函數的輸出
升級到CDP之前
最大的函數返回值列表中的最大值。最小函數返回值列表中的最小值。
升級到CDP之后
當一個或多個參數為NULL時返回NULL。
需要采取的行動
在用作最大或最小函數的參數的列上使用NULL過濾器或nvl函數。
SELECT greatest(nvl(col1,default value incase of NULL),nvl(col2,default value incase of NULL));重命名表
為了強化系統,可以將Hive數據存儲在HDFS加密區域中。RENAME已更改來防止將表移到相同的加密區域之外或移入非加密區域。
升級到CDP之前
在CDH和HDP中,重命名托管表將移動其HDFS位置。
升級到CDP之后
重命名托管表僅在創建不帶LOCATION子句且位于其數據庫目錄下的表時才移動其位置。
需要采取的行動
沒有。
原文鏈接:https://docs.cloudera.com/cdp-private-cloud/latest/upgrade/topics/cdp_data_migration_hive_semantics.html
總結
以上是生活随笔為你收集整理的hive 语法检查_升级Hive3处理语义和语法变更的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程,外星人飞船
- 下一篇: 试说明机器指令和微指令之间的关系_男女关