報錯信息
HQL在查詢語句中有中文時會有如下報錯信息:
嚴重: org.apache.calcite.runtime.CalciteException: Failed to encode '數學' in character set 'ISO-8859-1'
(這里中文為“數學”字符)
出現原因
出現這種現象的原因一般是因為字符編碼問題,默認編碼是'ISO-8859-1', 這是一種單字節編碼,中文會出現亂碼情況,導致報錯。
解決辦法
解決辦法有以下兩種:
方法一:關閉基於CBO的查詢優化
直接在hive客戶端輸入以下代碼,並重新進行hql查詢就不會再報錯了
set hive.cbo.enable=false;
方法二:是直接指定字符編碼,比如說指定用'UTF8'、'UTF16'等支持中文的編碼
對於CBO的簡單介紹:
CBO的主要目標是通過檢查查詢中指定的表和條件來生成有效的執行計划,最終減少查詢執行時間並降低資源利用率。解析后,查詢將轉換為代表查詢必須執行的操作的邏輯樹(抽象語法樹),例如讀取特定表或執行內部JOIN。提供各種優化方法,例如查詢重寫,JOIN重新排序,導出隱式謂詞和JOIN消除,以生成邏輯上等效的計划。當前模型更傾向於使用密集計划,以實現最大並行度。每個邏輯計划都根據基於不同值的啟發式方法的數量分配成本。
Hive從0.14.0開始引入CBO(Cost-Based Optimizer),對HQL查詢語句進行性能優化,在Hive 1.1.0之后,默認開啟。HIVE使用Apache Calcite框架實現。