本文為您列舉MaxCompute SQL與標準SQL的區別及常見問題解決方法。
MaxCompute SQL與標準SQL的基本區別
主要區別 | 問題現象 | 解決方法 |
應用場景 | 不支持事務(不支持Commit和Rollback,不推薦使用INSERT INTO)。 | 建議代碼具備冪等性,支持重新執行。推薦您使用INSERT OVERWRITE寫數據。 |
不支持索引和主鍵約束。 | 無。 | |
部分字段不支持默認值或默認函數。 | 如果字段有默認值,您可以在數據寫入時自行賦值。MaxCompute支持在創建表時,對BIGINT、DOUBLE、BOOLEAN和STRING類型的字段添加默認值。 | |
不支持自增字段。 | 無。 | |
表分區 | 單表最多支持6萬個分區。超過6萬個分區會報錯。 | 選擇合適的分區列,減少分區數。 |
一次查詢輸入的分區不能超過1萬個,否則會報錯。如果是2級分區且查詢時只根據2級分區進行過濾,總的分區數大于1萬也可能導致報錯。 | ||
精度 | DOUBLE類型存在精度問題。 | 不建議直接使用等于號(=)關聯兩個DOUBLE字段。建議將兩個數相減,如果差距小于一個預設的值,則認為兩個數是相同的。例如 |
雖然MaxCompute支持高精度類型DECIMAL,但是有更高精度的要求。 | 如果有更高的精度要求,您可以先把數據存儲為STRING類型,然后使用UDF實現對應的計算。 | |
數據類型轉換 | 出現各種預期外的錯誤,代碼維護問題。 | 如果有2個不同的字段類型需要執行JOIN操作,建議您先轉換字段類型再執行JOIN操作。 |
日期類型和字符串的隱式轉換。 | 如果在需要傳入日期類型的函數中傳入一個字符串,字符串和日期類型根據 |
DDL與DML的區別及解決方法
主要區別 | 問題現象 | 解決辦法 |
表結構 | 不能修改分區列列名,只能修改分區列對應的值。 | 解決方案請參見分區和分區列的區別是什么?。 |
支持增加列,但是不支持刪除列及修改列的數據類型。 | 解決方案請參見如何修改列的數據類型?和如何刪除列?。 | |
INSERT | MaxCompute SQL需要在INSERT INTO或INSERT OVERWRITE后加關鍵字TABLE。 | 無。 |
數據插入表的字段映射不是根據SELECT的別名執行,而是根據SELECT字段的順序和表中字段的順序執行映射。 | 無。 | |
UPDATE和DELETE | 僅支持對Transactional表執行UPDATE和DELETE語句。 | |
SELECT | MaxCompute SQL最多支持6張小表的MAPJOIN,并且連續JOIN的表不能超過16張。 | |
IN和NOT IN | IN、NOT IN、EXISTS和NOT EXISTS,后面的子查詢返回的分區數據量不能超過1000條。 | 解決方案請參見在執行MaxCompute SQL過程中,使用NOT IN后面接子查詢,子查詢返回的結果是上萬級別的數據量,但當IN和NOT IN后面的子查詢返回的是分區時,返回的數量上限為1000。在必須使用NOT IN的情況下,該如何實現此查詢?。如果業務上已經保證子查詢返回結果的唯一性,可以考慮去掉DISTINCT,從而提升查詢性能。 |
SQL返回10000條 | MaxCompute限制了單獨執行SELECT語句時返回的數據條數。 | 解決方案請參見LIMIT限制輸出行數(number)。 |
需要查詢的結果數據條數很多。 | ||
MAPJOIN | JOIN不支持笛卡爾積。 | JOIN必須要用ON關鍵字設置關聯條件。 如果有一些小表要作為廣播表,需要使用MAPJOIN HINT。 |
ORDER BY | ORDER BY需要配合LIMIT N使用。 | 如果希望執行大數據量的排序任務,甚至是全表排序任務,可以增大N值。解決方案請參見MaxCompute查詢得到的數據是根據什么排序的?。 |
UNION ALL | 參與UNION ALL運算的所有表必須列數一致,否則會報錯。 | 參與UNION ALL運算的所有列的數據類型、列個數和列名稱必須完全一致。 |
UNION ALL需要再嵌套一層子查詢。 | 無。 |