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語句一併運行。
與相關函數的區別
函數名稱 | 傳回型別 | 是否直接返回對象內容 | 典型用途 |
BINARY | 是 | 立即在 SQL 中解析或轉換較小的對象內容。 | |
BLOB | 否,返回可供後續讀取的 BLOB 引用 | 延遲讀取、傳給支援 BLOB 的函數、寫入 BLOB 表。 | |
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名稱,如 如果在建表時選擇了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返回當前函數調用結果的方式。取值如下:
|
傳回值說明
返回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資料
上傳如下TXT資料到OSStest_travel.zip。
建立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>/';讀取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資料
上傳如下PDF資料到OSSpdf_demo.zip。
建立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>/';讀取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 |
+------+-------+步驟三:讀取部分對象內容
以下樣本從每個對象的第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 | +------+----------------+讀取該 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 表
如果需要長期儲存或供後續任務複用,可以將結果寫入支援 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;寫入後可以使用
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;