全部產品
Search
文件中心

MaxCompute:SQL其他常見問題

更新時間:Aug 07, 2024

本文為您介紹在MaxCompute中執行SQL時,與資料類型、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作業資訊,請參見計算最佳化最佳實務