全部產品
Search
文件中心

MaxCompute:與標準SQL的主要區別及解決方案

更新時間:Jul 26, 2024

本文為您列舉MaxCompute SQL與標準SQL的區別及常見問題解決方案。

MaxCompute SQL與標準SQL的基本區別

主要區別

問題現象

解決方案

應用情境

不支援事務(不支援Commit和Rollback,不推薦使用INSERT INTO)。

建議代碼具備等冪性,支援重新執行。推薦您使用INSERT OVERWRITE寫資料。

不支援索引和主鍵約束。

無。

部分欄位不支援預設值或預設函數。

如果欄位有預設值,您可以在資料寫入時自行賦值。MaxCompute支援在建立表時,對BIGINT、DOUBLE、BOOLEAN和STRING類型的欄位添加預設值。

不支援自增欄位。

無。

表分區

單表最多支援6萬個分區。超過6萬個分區會報錯。

選擇合適的分區列,減少分區數。

一次查詢輸入的分區不能超過1萬個,否則會報錯。如果是2級分區且查詢時只根據2級分區進行過濾,總的分區數大於1萬也可能導致報錯。

解決方案請參見執行INSERT INTO或INSERT OVERWRITE操作時,報錯a single instance cannot output data to more than 10000 partitions,如何解決?

精度

DOUBLE類型存在精度問題。

不建議直接使用等號(=)關聯兩個DOUBLE欄位。建議將兩個數相減,如果差距小於一個預設的值,則認為兩個數是相同的。例如ABS(a1-a2)<0.000000001

雖然MaxCompute支援高精度類型DECIMAL,但是有更高精度的要求。

如果有更高的精度要求,您可以先把資料存放區為STRING類型,然後使用UDF實現對應的計算。

資料類型轉換

出現各種預期外的錯誤,代碼維護問題。

如果有2個不同的欄位類型需要執行JOIN操作,建議您先轉換欄位類型再執行JOIN操作。

日期類型和字串的隱式轉換。

如果在需要傳入日期類型的函數中傳入一個字串,字串和日期類型根據yyyy-mm-dd hh:mi:ss格式進行轉換。

DDL與DML的區別及解決方案

主要區別

問題現象

解決辦法

表結構

不能修改分區列列名,只能修改分區列對應的值。

解決方案請參見分區和分區列的區別是什嗎?

支援增加列,但是不支援刪除列及修改列的資料類型。

解決方案請參見如何修改列的資料類型?如何刪除列?

INSERT

MaxCompute SQL需要在INSERT INTO或INSERT OVERWRITE後加關鍵字TABLE。

無。

資料插入表的欄位對應不是根據SELECT的別名執行,而是根據SELECT欄位的順序和表中欄位的順序執行映射。

無。

UPDATE和DELETE

僅支援對Transactional表執行UPDATE和DELETE語句。

解決方案請參見如何刪除MaxCompute表或分區中的資料?如何更新MaxCompute表或分區中的資料?

SELECT

MaxCompute SQL最多支援6張小表的MAPJOIN,並且連續JOIN的表不能超過16張。

解決方案請參見在執行JOIN操作時,報錯Maximum 16 join inputs allowed,如何解決?

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)

需要查詢的結果資料條數很多。

解決方案請參見使用SQLTask執行SQL查詢時,如果查詢結果條數大於限制的10000條,該如何擷取所有資料?

MAPJOIN

JOIN不支援笛卡爾積。

JOIN必須要用ON關鍵字設定關聯條件。

如果有一些小表要作為廣播表,需要使用MAPJOIN HINT。

ORDER BY

ORDER BY需要配合LIMIT N使用。

如果希望執行巨量資料量的排序任務,甚至是全表排序任務,可以增大N值。解決方案請參見MaxCompute查詢得到的資料是根據什麼排序的?

UNION ALL

參與UNION ALL運算的所有表必須列數一致,否則會報錯。

參與UNION ALL運算的所有列的資料類型、列個數和列名稱必須完全一致。

UNION ALL需要再嵌套一層子查詢。

無。