本文為您介紹在MaxCompute中執行SQL時,與資料類型、SQL限制等相關的常見問題。
問題類別 | 常見問題 |
資料類型 | |
SQL限制 | |
SQL作業運行 | |
SQL作業查看 | |
SQL作業調優 |
MaxCompute的時間類型欄位是否可以不帶時分秒?
時間類型欄位可以使用DATE資料類型。使用該資料類型時,您需要開啟MaxCompute 2.0資料類型開關。更多MaxCompute 2.0資料類型資訊,請參見2.0資料類型版本。
在執行MaxCompute SQL過程中,對DOUBLE類型的資料進行等值比較,為什麼結果不符合預期?
由於MaxCompute中DOUBLE類型的數值存在一定的精度差,因此不建議直接使用等號(=)對兩個DOUBLE類型的資料進行比較。
請對兩個DOUBLE類型資料相減,然後取絕對值,當絕對值足夠小時,判定兩個DOUBLE類型的資料數值相等。
如何解決DECIMAL資料類型精度溢出問題?
您可以在Session層級執行set odps.sql.decimal.odps2=true;
命令,開啟2.0資料類型開關。但您需要注意,MaxCompute支援的DECIMAL類型資料的最大長度為38位,但實際業務處理過程中如果資料存放區為最大長度,在資料處理過程中很容易出現資料溢出問題,建議調小資料長度。
新建立的MaxCompute專案不支援資料類型自動隱式轉換,如何解決?
關閉MaxCompute 2.0資料類型之後可進行隱式轉換。更多資料類型轉換資訊,請參見資料類型轉換。
查詢資料時,提示XXXtypeisnotenabled incurrentmode,如何解決?
您可以在Session層級執行set odps.sql.decimal.odps2=true;
命令,開啟2.0資料類型開關。
如何處理單欄位大於8 MB的限制?
由於儲存機制限制,MaxCompute表中單個欄位的最大長度不能超過8 MB。對於超過8 MB的欄位,建議您拆分成多個欄位。具體的拆分邏輯您可以根據業務特性設計,保證每個欄位不超過8 MB即可。
由於複雜結構的超大欄位在資料開發和分析中會嚴重影響計算效能,因此建議根據資料倉儲建設規範來設計您的資料架構,避免出現超大欄位:
具有複雜結構的未經處理資料,作為ODS層,最好以壓縮的方式歸檔。
定時(例如每天)對ODS層的增量資料做資料清洗,複雜欄位拆分為多個簡單欄位,然後儲存在CDM層的表中,便於統計和分析資料。
在執行MaxCompute SQL過程中,報錯partitions exceeds the specified limit,如何解決?
問題現象
在執行MaxCompute SQL過程中,返回報錯如下。
FAILED: ODPS-0010000:System internal error - OTS filtering exception - Ots read range partitions exceeds the specified limit:10000: tableName:xxxx , please check hive conf key
產生原因
MaxCompute單張表支援6萬個分區,但是單次查詢最多隻支援1萬個分區。該報錯常見原因如下:
原因一:分區未寫分區條件。
原因二:使用類似使用者ID的欄位作為分區欄位,導致分區數量過多。
解決措施
原因一的解決措施:如果未寫分區條件,補上分區條件即可。
原因二的解決措施:如果分區列不合適,導致分區數量太多,請考慮更改分區列。
如何非互動式運行MaxCompute SQL?
在作業系統中,您可以通過Shell非互動式運行MaxCompute SQL:
使用
odps -f filename
方式,讀取並處理SQL檔案。如果運行SQL,Filename檔案的第一行是
SQL
表示已經進入SQL模式。命令樣本如下。SQL select ... from table_name where xxx;
如果只運行一個SQL語句,您可以使用MaxCompute SQL中的
sqltext
方法,命令樣本如下。./odpscmd -e "select * from dual;"
您可以通過
odps -help
獲得更多的資訊。
SQL能將MaxCompute的配置轉移到另外一個阿里雲帳號上嗎?
您可以通過Package方法實現。更多Package授權資訊,請參見MaxCompute多團隊協同資料開發專案管理最佳實務。
如何將開發環境的表資料同步至生產環境的表中?
您可以通過MaxCompute用戶端執行如下命令。
insert into project.table select * from project_dev.table;
如果沒有生產環境中表的讀寫權限,需要完成帳號授權。更多授權資訊,請參見MaxCompute許可權。
如何判斷一個欄位是否為空白?
您可以通過MaxCompute SQL的運算子判斷欄位是否為空白,更多運算子資訊,請參見運算子。
是否可以通過DataWorks的Shell節點調取MaxCompute SQL?
不可以。Shell節點僅支援標準Shell文法,不支援互動性文法。如果作業較多,您可以使用ODPS SQL節點執行作業。更多ODPS SQL節點資訊,請參見開發ODPS SQL任務。
如何在SQL中實現迴圈?
您可以通過DataWorks的do-while節點實現。
如何在SQL中調用賦值節點?
您可以通過DataWorks的for-each節點實現。
如何查看MaxCompute日執行的所有SQL?
您可以執行show p -all -limit <number>;
命令查看MaxCompute專案下所有成員歷史執行的SQL資訊。更多查看執行個體資訊,請參見查看執行個體資訊。
如何查看SQL作業消耗的資源量?
您可以通過賬單查看SQL作業消耗的資源量。更多查看賬單實踐資訊,請參見MaxCompute賬單用量明細分析。
如何查看SQL執行費用?
您可以使用cost sql
命令預估查詢費用。更多命令資訊,請參見計量預估。
SQL作業運行過慢,如何最佳化?
SQL作業可以通過Logview進行定位,定位方法請參見Logview診斷實踐。
更多最佳化SQL作業資訊,請參見計算最佳化最佳實務。