全部產品
Search
文件中心

:外部表格常見問題

更新時間:Jun 25, 2025

本文為您介紹外部表格的常見問題。

問題類別

常見問題

OSS外部表格

Hologres外部表格

通過MaxCompute直讀Hologres資料時,報錯ODPS-0130071,如何解決?

效能問題

基於外部表格執行SQL作業時,運行慢,如何解決?

自訂Extractor在讀取非結構化資料時,如果資料欄位存在DATETIME類型,報錯ODPS-0123131,如何解決?

  • 問題現象

    自訂Extractor在讀取非結構化資料時,如果資料欄位存在DATETIME類型(例如2019-11-11 06:43:36),會返回如下報錯。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • 產生原因

    查看指定位置的代碼Date.valueOf(parts[i]),其中java.sql.Date.valueOf()函數只支援形如"yyyy-[m]m-[d]d"的STRING型別參數,不支援DATETIME時間型別參數。

  • 解決措施

    1. 引入Joda-Time依賴並在代碼中增加匯入資訊。

      --依賴。
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      --匯入資訊。
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. 引入DateTimeFormat.forPattern()函數,將DATETIME類型的日期格式轉化為STRING類型進行讀取。

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           

    使用樣本如下。

    1. 通過MaxCompute用戶端上傳Extractor專案打包產生的JAR包。

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar為產生JAR包的本地儲存路徑。

    2. 通過MaxCompute用戶端上傳Joda-Time第三方JAR包。

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar為Joda-Time第三方JAR包本地存放路徑。

    3. 上傳測試資料至OSS指定的目錄下。假設檔案名稱為video_play_log.txt,樣本資料如下。

      5c661071dba64d5080c91da085ff1073^音樂-點擊-快進^26.12.04.68^2019-11-11 06:43:36                           
    4. 通過外部表格讀取資料。

      select * from <project_name>.video_play_log;

      讀取結果如下。

      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | 音樂-點擊-快進 | 26.12.04.68 | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+     

在MaxCompute上訪問OSS外部表格,編寫UDF本地測試通過,上傳後報錯記憶體溢出,如何解決?

  • 問題現象

    在MaxCompute上訪問OSS外部表格,編寫UDF本地測試通過,上傳後返回如下報錯。

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.OutOfMemoryError: Java heap space        

    設定如下參數後已耗用時間增加但依然報錯。

    set odps.stage.mapper.mem = 2048; 
    set odps.stage.mapper.jvm.mem = 4096;       
  • 產生原因

    外部表格的對象檔案太多,記憶體佔用過大且未設定分區。

  • 解決措施

    • 使用小資料量查詢。

    • 將對象檔案進行分區,以減少記憶體佔用。

通過外部表格處理OSS資料時,報錯Inline data exceeds the maximun allowed size,如何解決?

  • 問題現象

    處理OSS資料時,報錯Inline data exceeds the maximum allowed size

  • 產生原因

    OSS Store對於每一個小檔案有一個大小限制,如果超過3 GB則報錯。

  • 解決措施

    針對該問題,您可以通過調整以下兩個屬性進行處理。其原理是通過屬性值調整執行計畫,控制每個Reducer寫入外部表格OSS的資料大小,使得OSS Store檔案不超過3 GB的限制。

    set odps.sql.mapper.split.size=256; #調整每個Mapper讀取資料的大小,單位是MB。
    set odps.stage.reducer.num=100; #調整Reduce階段的Worker數量。

如何在MaxCompute中使用OSS外部表格讀取JSON資料?

在MaxCompute中使用OSS外部表格讀取JSON資料的操作,請參見在MaxCompute中使用OSS外部表格讀取JSON資料

如何通過OSS外部表格將多個小檔案輸出為一個檔案?

通過Logview日誌,查看SQL的執行計畫中最後一個是Reducer還是Joiner。如果是Reducer,則執行語句set odps.stage.reducer.num=1;,如果是Joiner,則執行語句set odps.stage.joiner.num=1;

通過MaxCompute直讀Hologres資料時,報錯ODPS-0130071,如何解決?

  • 問題現象

    直讀Hologres資料時,報錯ODPS-0130071 Failed to split to equal size...max count: 7777。例如:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • 產生原因

    MaxCompute直讀Hologres中的資料時,按照預設的拆分Mapper策略(輸入資料量/split.size 256 M),導致任務產生的Mapper並發數超過了最大限制數7777。

    說明

    該限制是防止使用者直接提交產生大量Mapper任務,從而對Hologres檔案或網路連接的穩定性產生影響。

  • 解決措施

    您可以通過設定以下參數,解決報錯問題。

    SET odps.external.holo.mapper.instances=10000; --提高並發上限,最高不超過10000
    SET odps.sql.mapper.split.size=512; --調整任務並發數,最高不超過512M

基於外部表格執行SQL作業時,運行慢,如何解決?

基於外部表格執行SQL作業時,運行慢的常見情況如下:

  • OSS外部表格中的GZ壓縮檔讀取慢

    • 問題現象

      使用者建立了一個OSS外部表格,資料來源為OSS中的GZ壓縮檔,大小為200 GB。在讀取資料過程中執行緩慢。

    • 產生原因

      由於Map端執行計算的Mapper數量過少,所以SQL處理慢。

    • 解決措施

      • 對於結構化資料,您可以設定以下參數調整單個Mapper讀取資料量的大小,加速SQL執行。

        set odps.sql.mapper.split.size=256; #調整每個Mapper讀取Table資料的大小,單位是MB。       
      • 對於非結構化資料,您需要查看OSS外部表格路徑下的OSS檔案是否只有1個。如果只有1個,由於壓縮方式下的非結構化資料不支援拆分,所以只能生產1個Mapper,導致處理速度較慢。建議您在OSS對應的外部表格路徑下,將OSS大檔案拆分為小檔案,從而增加讀取外部表格產生的Mapper數量,提升讀取速度。

  • 使用SDK搜尋MaxCompute外部表格資料速度慢

    • 問題現象

      使用SDK搜尋MaxCompute外部表格資料速度慢。

    • 解決措施

      外部表格僅支援全量搜尋,所以較慢,建議您改用MaxCompute內部表。

  • 查詢外部表格Tablestore資料慢

    • 問題現象

      查詢外部表格Tablestore的資料慢,同樣的業務資料,1個即時寫入Tablestore,1個定時寫入MaxCompute,兩個表結構和資料量一樣。查詢MaxCompute內部表耗時遠小於查詢Tablestore外部表格。

    • 解決措施

      這種情況可能是對1份資料進行了多次計算,導致速度慢。相比每次從Tablestore遠程讀取資料,更高效快速的方法是先一次性把需要的資料匯入到MaxCompute內部,轉為MaxCompute內部表,再進行查詢。

讀取OSS外部表格時報錯Couldn't connect to server,如何解決?

  • 問題現象

    讀取OSS外部表格的資料時,報錯ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server

  • 產生原因

    • 原因一:建立OSS外部表格時,oss_location地址中的oss_endpoint使用了公網地址,未使用內網地址。

    • 原因二:建立OSS外部表格時,oss_location地址中的oss_endpoint使用了其他Region的地址。

  • 解決措施

    • 對於原因一:

      您需要核查OSS外部表格的建表語句中oss_location參數的oss_endpoint是否為內網地址,如果是公網地址則需要修改為內網地址,具體參數資訊請參見參數說明

      例如,使用者在印尼(雅加達)地區,使用了oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....地址建立外部表格,應該改為對應的內網地址oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/....

    • 對於原因二:

      您需要核查OSS外部表格的建表語句中,oss_location參數的oss_endpoint是否為要訪問的Region的Endpoint,更多OSS傳統網路網域名稱資訊,請參見OSS地區和訪問網域名稱

建立OSS外部表格時報錯Network is unreachable (connect failed) ,如何解決?

  • 問題現象

    建立OSS外部表格時,報錯ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed)

  • 產生原因

    建立OSS外部表格時,oss_location地址中的oss_endpoint使用了公網地址,未使用內網地址。

  • 解決措施

    你需要核查OSS外部表格的建表語句中,oss_location參數的oss_endpoint是否為內網地址。如果是公網地址,則需要修改為內網地址,具體參數資訊請參見參數說明

    例如,使用者在華北2(北京)地區,使用了oss://oss-cn-beijing.aliyuncs.com/<bucket>/....地址建立外部表格,應該改為對應的內網地址oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....