全部產品
Search
文件中心

MaxCompute:GET_BLOB_FROM_OSS

更新時間:Sep 02, 2026

GET_BLOB_FROM_OSS是 MaxCompute Object Table 情境下的非結構化資料處理函數。可根據 Object Table 中記錄的對象 key,產生一個指向 OSS 對象全部或部分內容的Blob值。

使用情境

該函數適合圖片、音視頻、PDF、模型輸入等大對象的延遲讀取和 BLOB 表入庫情境。

與GET_DATA_FROM_OSS不同,GET_BLOB_FROM_OSS返回的不是已經下載到當前運算式中的二進位內容,而是包含儲存位置、位元組範圍和可選內容類型等資訊的BLOB引用。

後續支援:

  • 使用READ BLOB按需讀取 BLOB 內容;

  • 將 BLOB 寫入支援 BLOB 類型的目標表,供後續任務讀取和處理,詳情可見Blob資料類型與多模態儲存;

  • 使用GET_BLOB_METADATA函數查看內容長度、內容類型和儲存類型等元資訊;

  • 直接使用 Object Table 偽列 _blob,作為基礎調用形式的簡寫。

使用限制

  • MaxCompute需要2.0資料類型,詳情可見2.0資料類型版本。

  • MaxCompute專案需要支援Schema功能,詳情請參見Schema功能開啟。

  • 暫不支援用於MaxQA查詢加速。若基於DataWorks的SQL節點執行需添加參數SET odps.mcqa.disable=true;與SQL語句一併運行。

與相關函數的區別

函數名稱

傳回型別

是否直接返回對象內容

典型用途

GET_DATA_FROM_OSS

BINARY

是

立即在 SQL 中解析或轉換較小的對象內容。

GET_BLOB_FROM_OSS

BLOB

否,返回可供後續讀取的 BLOB 引用

延遲讀取、傳給支援 BLOB 的函數、寫入 BLOB 表。

GET_SIGNED_URL_FROM_OSS

STRING

否,返回有有效期間的 OSS 簽名 URL

將對象交給 MaxCompute 之外的 HTTP 用戶端下載或上傳。

命令格式

BLOB GET_BLOB_FROM_OSS(
  STRING <full_object_table_name>,
  STRING <key>
  [, BIGINT <offset>]
  [, BIGINT <length>]
  [, STRING <object_not_found_policy>]
)

如果需要同時指定 length,必須先指定 offset。

不同參數組合方式如下:

GET_BLOB_FROM_OSS(table_name, key)
GET_BLOB_FROM_OSS(table_name, key, object_not_found_policy)
GET_BLOB_FROM_OSS(table_name, key, offset, length)
GET_BLOB_FROM_OSS(table_name, key, offset, length, object_not_found_policy)

參數說明

參數

是否必填

資料類型

預設值

說明

full_object_table_name

是

STRING

無

開啟Schema文法開關後,完整的Object Table定義路徑需包括Project和Schema名稱,如project.schema.object_table。

如果在建表時選擇了RoleARN的認證方式,該參數將協助使用者自動產生訪問OSS的STS Token。

key

是

STRING

無

即被訪問對象在該Object Table中的名稱。詳情請參見查看Object Table屬性返回結果中的key參數說明。

offset

否

BIGINT

0

表示讀取對象內容的起始位置,取值大於等於0。

length

否

BIGINT

-1

需要讀取的位元組數。

object_not_found_policy

否

STRING

OUTPUT_NULL

表示快取資料中存在某個對象的key,但在實際的OSS中該對象已不存在時,MaxCompute返回當前函數調用結果的方式。取值如下:

  • OUTPUT_NULL:不拋出異常,輸出為NULL。

  • THROW_EXCEPTION:直接拋出異常,終止當前任務。

  • WARN_AND_NULL:不拋出異常,輸出為NULL。同時在SQL Runtime的輸出日誌中記錄該對象不存在的情況。如果大量對象出現這種不一致的情況,可能會對整體任務的效能造成一定影響。

傳回值說明

返回BLOB類型。

BLOB 中記錄當前對象的 OSS 儲存引用、有效位元組範圍、對象大小等資訊,而不是把完整對象內容直接作為傳回值攜帶。因此不能使用STRING(GET_BLOB_FROM_OSS(...))讀取常值內容。需要先調用 READ_BLOB 得到 BINARY,再轉換成字串。例如:

SET odps.namespace.schema=true;
SELECT CAST(
         READ_BLOB(
           GET_BLOB_FROM_OSS(
             '<project_name>.<schema_name>.ot_demo',
             key
           )
         ) AS STRING
       ) AS object_text
FROM ot_demo
WHERE key = 'example.txt';

使用樣本

Object Table 只緩衝 OSS 對象元資訊,不複製對象內容。OSS 對象新增、刪除或變更後,應按照表的中繼資料重新整理策略及時重新整理;否則可能出現緩衝中有 key、但OSS 中對象已不存在的情況。

資料準備

TXT資料

  1. 上傳如下TXT資料到OSStest_travel.zip。

  2. 建立Object Table。

    SET odps.namespace.schema=true; 
    CREATE OBJECT TABLE IF NOT EXISTS txt_demo
    WITH SERDEPROPERTIES (
      'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole')
    LOCATION 'oss://oss-<region>-internal.aliyuncs.com/<oss_path>/';
  3. 讀取Object Table。

    ALTER TABLE txt_demo REFRESH METADATA;
    
    SET odps.namespace.schema=true; 
    SELECT COUNT(*) AS ROW_COUNT FROM txt_demo; 
    
    -- 返回結果如下:
    +------------+
    | row_count  | 
    +------------+
    | 20         | 
    +------------+

PDF資料

  1. 上傳如下PDF資料到OSSpdf_demo.zip。

  2. 建立Object Table。

    SET odps.namespace.schema=true; 
    CREATE OBJECT TABLE IF NOT EXISTS pdf_demo
    WITH SERDEPROPERTIES (
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole')
    LOCATION 'oss://oss-<region>-internal.aliyuncs.com/<oss_path>/';
  3. 讀取Object Table。

    -- 重新整理,即圖片元資訊緩衝在MaxCompute中。
    ALTER TABLE pdf_demo REFRESH METADATA;
    
    SET odps.namespace.schema=true; 
    SELECT COUNT(*) AS ROW_COUNT FROM pdf_demo; 
    
    -- 返回結果如下:
    +------------+
    | row_count  |
    +------------+
    | 10         |
    +------------+

步驟一:為每個OSS對象產生BLOB

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT
  key,
  GET_BLOB_FROM_OSS(
    '<project>.<schema>.txt_demo',
    key
  ) AS object_blob
FROM txt_demo limit 1;

-- 等價於下方文法:

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT
  key,
    GET_BLOB_FROM_OSS(
        '<project>.<schema>.txt_demo',
        key,
        0,
        -1,
        'OUTPUT_NULL'
    ) AS object_blob
FROM txt_demo limit 1;

-- 返回結果如下:
+------+-------------+
| key  | object_blob |
+------+-------------+
| test_travel01.txt | CAEQAxrgAgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAWAEAAFgBAABYAQAAWAEAAFgBAABgAQAAYAEAAGABAABgAQAADwEAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOQAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA0L0FkaG9jU2luay8yMDI2MDgwNDA5MTcyMzg4NWdqZXZsNmtoNXplNS9jb25zb2xlX3F1ZXJ5X3Rhc2tfMTc4NTgzNTA0MzQxNjBfMC8xLy1leHQtLzIwMjYwODA0MDkxNzIzODg1Z2pldmw2a2g1emU1X00xXzBfMF8wMDAwMDBfY2lkMS5ibG9iAQAAAAAAAAAiACoUsPTTV9LIq38UBOcOFkMuEmqWFngyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HTIwMjYwODA0MDkxNzIzODg1Z2pldmw2a2g1emU1 |
+------+-------------+

步驟二:使用_blob偽列簡寫

_blob不是 Object Table 的真實中繼資料列,因此 SELECT * 不會自動包含該列,必須顯式引用。需要設定位移量、長度、缺失策略或內容類型時,應使用完整函數調用。

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT key, _blob FROM txt_demo limit 1;

-- 等價於如下寫法

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT
  key,
  GET_BLOB_FROM_OSS(
    '<project>.<schema>.txt_demo',
    key
  ) AS `_blob`
FROM txt_demo limit 1;

-- 返回結果如下:
+------+-------+
| key  | _blob |
+------+-------+
| test_travel01.txt | CAEQAxreAgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAABeAQAADwEAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA0L0FkaG9jU2luay8yMDI2MDgwNDA5MzAyNzk2NWc4M2FpamkyNjVuL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODM1ODI3NDA1MF8wLzEvLWV4dC0vMjAyNjA4MDQwOTMwMjc5NjVnODNhaWppMjY1bl9NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAAIgAqFA2jSV9PtAiPH3AM0+59uTImxTmQMhkKCW5zLWRpcmVjdBIMeXl5X3Rlc3RfZGV2OhwyMDI2MDgwNDA5MzAyNzk2NWc4M2FpamkyNjVu |
+------+-------+

步驟三:讀取部分對象內容

  1. 以下樣本從每個對象的第0位元組開始,最多引用64位元組。

    -- 開啟資料類型2.0開關
    SET odps.sql.type.system.odps2=true;
    -- 開啟三層文法開關
    SET odps.namespace.schema=true;
    -- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
    SET odps.mcqa.disable=true;
    
    SELECT
      key,
      read_blob(  
        GET_BLOB_FROM_OSS(
          '<project>.<schema>.txt_demo',
          key,
          0,
          64
      ))AS object_segment
    FROM txt_demo limit 1;
    
    -- 返回結果如下。
    +------+----------------+
    | key  | object_segment |
    +------+----------------+
    | test_travel01.txt | =E5=8C=97=E4=BA=AC=C2=B7=E6=95=85=E5=AE=AB=EF=BC=88=E5=8E=86=E5=8F=B2=E5=8F=A4=E8=BF=B9=EF=BC=89=EF=BC=9A=E7=BA=A2=E5=A2=99=E9=BB=84=E7=93=A6=E9=97=B4=E6=B5=81=E6=B7=8C=E7=9D=80=E5=85=AD=E7=99 |
    +------+----------------+
  2. 讀取該 BLOB 時,read_blob 看到的是上述位元組範圍。還可以在該 BLOB 範圍內進行二次截取。

    SET odps.sql.type.system.odps2=true;
    -- 開啟三層文法開關
    SET odps.namespace.schema=true;
    -- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
    SET odps.mcqa.disable=true;
    
    SELECT read_blob(
             GET_BLOB_FROM_OSS(
               '<project>.<schema>.txt_demo',
               key,
               0,
               64
             ),
             0,
             32
           ) AS first_128_bytes_of_segment
    FROM txt_demo limit 1;
    
    -- 返回結果如下。
    +----------------------------+
    | first_128_bytes_of_segment |
    +----------------------------+
    | =E5=8C=97=E4=BA=AC=C2=B7=E6=95=85=E5=AE=AB=EF=BC=88=E5=8E=86=E5=8F=B2=E5=8F=A4=E8=BF=B9=EF=BC=89 |
    +----------------------------+

步驟四:設定內容類型並查看 BLOB 元資訊

GET_BLOB_METADATA 函數返回的 JSON 包含 content_type、content_length、storage_type、checksum、content_encoding 等欄位。

對於 GET_BLOB_FROM_OSS 產生的值,storage_type 為 OSS;未顯式傳入 content_type 時,對應元資訊為 NULL。

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT GET_BLOB_METADATA(
         GET_BLOB_FROM_OSS(
           '<project>.<schema>.pdf_demo',
           key,
           'THROW_EXCEPTION',
           'application/pdf'
         )
       ) AS blob_metadata
FROM pdf_demo
WHERE key LIKE '%.pdf' limit 1;

-- 返回結果如下:
+---------------+
| blob_metadata |
+---------------+
| {"checksum":null,"content_type":"application/pdf","storage_type":"OSS","is_compressed":false,"content_length":261567,"content_encoding":null,"blob_storage_tier":"STANDARD"} |
+---------------+

步驟五:寫入 BLOB 表

  1. 如果需要長期儲存或供後續任務複用,可以將結果寫入支援 BLOB 類型的表,詳情見Blob資料類型與多模態儲存。

    -- 開啟資料類型2.0開關
    SET odps.sql.type.system.odps2=true;
    -- 開啟三層文法開關
    SET odps.namespace.schema=true;
    -- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
    SET odps.mcqa.disable=true;
    
    CREATE TABLE IF NOT EXISTS object_blob_sink (
      object_key STRING,
      object_data BLOB
    )
    TBLPROPERTIES (
      'table.format.version' = '2',
      'transactional' = 'true'
    );
    
    INSERT INTO object_blob_sink
    SELECT
      key,
      GET_BLOB_FROM_OSS(
        'yyy_test_dev.default.txt_demo',
        key,
        'THROW_EXCEPTION'
      )
    FROM txt_demo;
  2. 寫入後可以使用 read_blob 讀取內容

    -- 開啟資料類型2.0開關
    SET odps.sql.type.system.odps2=true;
    
    SELECT
      object_key,
      CAST(READ_BLOB(object_data) AS STRING) AS object_text
    FROM object_blob_sink
    WHERE object_key = 'test_travel01.txt';
    
    -- 返回結果如下。
    +------------+-------------+
    | object_key | object_text |
    +------------+-------------+
    | test_travel01.txt | 北京·故宮(歷史古迹):紅牆黃瓦間流淌著六百年的皇家威嚴,秋季銀杏金黃時漫步其中,最能感受紫禁城的厚重與靜美。 |
    +------------+-------------+

步驟六:僅處理篩選後的對象

Object Table 查詢可以先根據中繼資料過濾,再為命中的對象產生 BLOB。

例如,僅處理 170 Bytes 以內的 PDF。先過濾 Object Table 中繼資料可以減少 OSS 狀態查詢和後續內容讀取量。

-- 開啟資料類型2.0開關
SET odps.sql.type.system.odps2=true;
-- 開啟三層文法開關
SET odps.namespace.schema=true;
-- 通過DataWorks的SQL節點執行時需要加:關閉mcqa
SET odps.mcqa.disable=true;

SELECT
  key,
  GET_BLOB_FROM_OSS(
    '<project>.<schema>.txt_demo',
    key,
    'WARN_AND_NULL',
    'application/txt'
  ) AS document_blob
FROM txt_demo
WHERE key LIKE '%.txt'
  AND size <= 170;

-- 返回結果如下:可看出已篩選過。
+------+---------------+
| key  | document_blob |
+------+---------------+
| test_travel01.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUqGGDqqv2cyDwow86F8uQa+wWHdQyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel02.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAoQAAAAAAAACkAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUUhmRcOOiCCBQ0LXOdBulUociULYyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel04.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAoQAAAAAAAABFAQAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoU69Ba157khgFI/9FvtdoawcOw4UkyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel08.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAqQAAAAAAAADmAQAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUEb5KuihKijpGxK0QjStIO4xvGuYyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel11.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAApwAAAAAAAACPAgAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUuVU6K/SEmU1aRdxjLSRgXhx0j1MyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
+------+---------------+

效能建議

按對象大小切分任務

GET_BLOB_FROM_OSS 屬於 Object Table 內容相關函數,可以觸發按對象大小進行任務切分,避免僅按中繼資料行數切分時,大檔案集中到少數 Worker 造成長尾。

預設按對象大小切分時,可根據對象分布調整切分單元:

-- 優先順序為 KB > MB > GB。通常應根據對象大小分布和單個對象處理耗時調整,不宜為了增加並發盲目設定過小的切分單元。

-- 預設單位配置,單位為 GiB。
SET odps.sql.object.table.split.unit.gb=1;

-- MB 配置優先於 GB 配置。
SET odps.sql.object.table.split.unit.mb=512;

-- KB 配置優先順序最高。
SET odps.sql.object.table.split.unit.kb=512;

-- 如需關閉按對象大小切分,可以設定如下參數。關閉後可能產生額外的預先處理作業,具體執行計畫以 Logview 為準。
SET odps.sql.object.table.split.by.object.size.enabled=false;

避免無意中讀取全部大對象

  • 如果下遊只需要檔案頭、魔數或小範圍內容,應設定offset和length。

  • 優先使用 Object Table 的key、size、type、last_modified等中繼資料列過濾對象。

  • GET_BLOB_FROM_OSS本身主要產生引用,但 read_blob 和寫入 BLOB 表可能觸發實際對象讀取,應按真實 OSS 流量和計算資源評估成本。

  • 若大量對象返回 WARN_AND_NULL,應重新整理 Object Table 中繼資料或檢查 OSS 資料生命週期,而不是長期依賴逐對象警示。

常見問題

第一個參數為什麼必須使用完整表名?

該參數不僅用於標識 Object Table,也用於從任務上下文取得表對應的 OSS 訪問配置。建議始終使用 project.schema.object_table三層全名,並確保它與 FROM 中實際掃描的 Object Table 一致。

為什麼對象明明在Object Table中,函數仍返回NULL?

Object Table 查詢使用緩衝中繼資料。如果對象在最近一次中繼資料重新整理後被刪除,預設策略 OUTPUT_NULL會返回 NULL。可以重新整理中繼資料,或臨時使用 WARN_AND_NULL、THROW_EXCEPTION 定位不一致資料。

GET_BLOB_FROM_OSS是否等同於下載對象?

不等同。函數會訪問 OSS 擷取對象狀態和大小,但返回的是 BLOB 引用。調用 read_blob、將 BLOB 交給需要內容的函數,或者把它寫入需要物化內容的目標表時,才會讀取對應對象位元組。

可以把 BLOB 當作分區列或主鍵嗎?

不可以。代碼中的類型校正禁止 BLOB 作為分區列或主鍵,也不支援把 BLOB 嵌套在 ARRAY、MAP、STRUCT等複雜類型中。BLOB 應作為普通資料列使用。

應該選GET_BLOB_FROM_OSS還是簽名URL?

  • 後續處理仍在 MaxCompute SQL、BLOB 體系內:使用 GET_BLOB_FROM_OSS。

  • 需要立即得到對象二進位內容:使用 GET_DATA_FROM_OSS。

  • 需要讓 ECS、第三方服務或 HTTP 用戶端直接存取 OSS:使用 GET_SIGNED_URL_FROM_OSS。簽名 URL 有有效期間,且受 Bucket Public Access 配置和網路 Endpoint 可達性影響。

查詢blob列詳情報錯“當前訪問存在異常”

  • 詳細報錯

    {"serverCostTime":191,"requestId":"068ebe0f2ed96a2aab0998e0770f40ec",
      "success":false,"errCode":"CP001",
      "errMsg":"當前訪問存在異常,請從資料分析首頁開始訪問。"}
  • 根本原因

    DataWorks的SQL節點預設執行MaxQA。

  • 解決方式

    通過DataWorks的SQL節點查詢ObjectTable時,需要加上SET odps.mcqa.disable=true;