全部產品
Search
文件中心

MaxCompute:GET_BLOB_METADATA

更新時間:Oct 10, 2026

GET_BLOB_METADATA()函數用於讀取一個blob的中繼資料,傳回值可繼續用 JSON 函數擷取欄位。

常見用法

GET_JSON_OBJECT(GET_BLOB_METADATA(blob_expr), '$.field_name');

使用要點

  • GET_BLOB_METADATA() 使用單個 blob 參數。

  • 返回結果可按 JSON 對象取欄位。

  • 常用欄位包括:content_type、content_length、checksum、is_compressed、content_encoding、storage_type、blob_storage_tier。

  • content_length 表示位元組長度,適合與 lengthb() 聯合校正。

  • is_compressed / content_encoding 可用於判斷是否壓縮及壓縮編碼。

  • NULL 或空 blob 輸入會返回 NULL。

命令格式

JSON GET_BLOB_METADATA(blob_expr:BLOB)

參數說明

blob_expr 參數說明:必填。Blob類型。

  • 可使用單個 blob 參數

  • 參數應為 blob 運算式

  • 常見輸入來源:to_blob(...)、表中的 blob 列、CTAS / INSERT SELECT 產出的 blob 列。

樣本:

GET_BLOB_METADATA(to_blob('abcdef'))
GET_BLOB_METADATA(to_blob('hello world', 'text/plain'))
GET_BLOB_METADATA(b)

傳回值說明

返回一個 metadata JSON 對象,JSON類型。JSON對象常用欄位包括如下:

實際使用時,通常按欄位取值,而不是直接展示整個對象。

欄位名稱

說明

content_type

業務寫入的內容類型。常見用途:

  • 校正 to_blob(..., content_type) 是否生效

  • 區分 text/plain、application/json 等不同類型

content_length

blob 內容位元組數。比如:

  • to_blob('abcdef') 為 6

  • to_blob(X'616263') 為 3

  • to_blob('中文測試') 為 12

  • 空內容為 0

checksum

內容校正值欄位,可用於輔助判斷內容或儲存物件是否一致;當沒有對應值時,結果為 NULL。

is_compressed

是否壓縮儲存。現有 case 只能說明:

  • 小的直接構造 blob 常見為 false

  • 持久化後的較大 blob 可能為 true

  • 是否壓縮與底層儲存/codec 有關

不建議僅根據當前 case 推導完整壓縮規則。

content_encoding

壓縮編碼名稱。

  • 若 is_compressed = false,則為 NULL

  • 若 is_compressed = true,則返回實際 codec 名稱

storage_type

儲存類型資訊,適合在排查 blob 儲存形態時查看。

blob_storage_tier

儲存層級資訊;若沒有對應值,則返回 NULL。

輸入參數與傳回值中的 NULL 說明

  • 輸入參數為 NULL 或空 blob 時

    以下情境下,GET_BLOB_METADATA(blob_expr) 的返回結果為 NULL

    • 入參本身為 NULL

    • blob 為空白內容

    • blob 不包含可讀取的有效內容

    -- 返回結果:NULL
    SELECT GET_BLOB_METADATA(to_blob(CAST(null as binary)));
    
    -- 這類情況下,如果繼續取欄位,返回結果仍為:NULL
    SELECT get_json_object(GET_BLOB_METADATA(to_blob(CAST(null as binary))), '$.content_length');
  • 返回結果中的欄位為 NULL 時

    即使 GET_BLOB_METADATA(blob_expr) 本身返回的不是 NULL,其中某些欄位也可能為空白。

    常見情況包括:

    • content_type:未指定內容類型時為 NULL

    • checksum:沒有對應校正值時為 NULL

    • content_encoding:未壓縮時為 NULL

    • blob_storage_tier:沒有對應儲存層級資訊時為 NULL

  • 可以把它理解為兩層含義:

    • 整個函數返回 NULL:這個 blob 沒有可返回的 metadata

    • 某個欄位為 NULL:metadata 存在,但該欄位當前沒有值

使用樣本

直接讀取

SELECT GET_BLOB_METADATA(to_blob('abcdef'));

-- 返回結果。
{
checksum:NULL
content_type:NULL
storage_type:"MEMORY"
is_compressed:false
content_length:6
content_encoding:NULL
blob_storage_tier:"STANDARD"
}

讀取最常用的三個欄位

適合快速看類型、位元組長度及是否壓縮。

SELECT
  get_json_object(GET_BLOB_METADATA(to_blob('abcdef')), '$.content_type'),
  get_json_object(GET_BLOB_METADATA(to_blob('abcdef')), '$.content_length'),
  get_json_object(GET_BLOB_METADATA(to_blob('abcdef')), '$.is_compressed');

-- 返回結果如下
+------------+------------+------------+
| _c0        | _c1        | _c2        | 
+------------+------------+------------+
| NULL       | 6          | false      | 
+------------+------------+------------+

校正業務寫入的content type

SELECT get_json_object(
  GET_BLOB_METADATA(to_blob('{"key":"value"}', 'application/json')),
  '$.content_type'
);

-- 顯式指定 content type 時,按照指定值返回。
+------------+
| _c0        | 
+------------+
| application/json | 
+------------+

校正內容長度

SELECT cast(
  get_json_object(GET_BLOB_METADATA(to_blob('中文測試')), '$.content_length') as bigint
);

-- 返回結果如下。
+------------+
| _c0        | 
+------------+
| 12         | 
+------------+

與 lengthb() 聯合做一致性校正

SELECT
  LENGTHB(TO_BLOB('abcdef')),
  CAST(GET_JSON_OBJECT(GET_BLOB_METADATA(TO_BLOB('abcdef')), '$.content_length') AS BIGINT);

-- 返回結果如下。
+------------+------------+
| _c0        | _c1        |
+------------+------------+
| 6          | 6          |
+------------+------------+

檢查持久化後的壓縮情況

  1. 準備測試表

    -- 建立包含Blob類型的Table
    CREATE TABLE blob_table2 (
      col1 INT ,
      col2 BLOB
    )
    TBLPROPERTIES (
      "table.format.version"="2" 
    );
    
    -- 資料寫入
    INSERT INTO blob_table2 VALUES (1, to_blob(repeat('aaa', 1000), 'application/json'));
    
    -- 資料讀取
    SELECT col1,read_blob(col2) FROM blob_table2;
  2. 查詢壓縮情況

    SELECT 
      get_json_object(GET_BLOB_METADATA(col2), '$.is_compressed') 
    FROM blob_table2;
    
    -- 返回結果如下。
    +-----+
    | _c0 |
    +-----+
    | true |
    +-----+

    is_compressed 可理解為“該 blob 當前是否以壓縮形式儲存”。

查看壓縮編碼

  1. 準備測試表

    -- 建立包含Blob類型的Table
    CREATE TABLE blob_table2 (
      col1 INT ,
      col2 BLOB
    )
    TBLPROPERTIES (
      "table.format.version"="2" 
    );
    
    -- 資料寫入
    INSERT INTO blob_table2 VALUES (1, to_blob(repeat('aaa', 1000), 'application/json'));
    
    -- 資料讀取
    SELECT col1,read_blob(col2) FROM blob_table2;
  2. 查看壓縮編碼

    SELECT
      get_json_object(GET_BLOB_METADATA(col2), '$.is_compressed'),
      get_json_object(GET_BLOB_METADATA(col2), '$.content_encoding')
    FROM blob_table2;
    
    -- 返回結果如下。
    +-----+-----+
    | _c0 | _c1 |
    +-----+-----+
    | true | ZSTD |
    +-----+-----+
    • 未壓縮時:content_encoding 為 NULL

    • 壓縮時:content_encoding 返回具體 codec 名稱

查看儲存相關資訊

  1. 準備測試表

    -- 建立包含Blob類型的Table
    CREATE TABLE blob_table2 (
      col1 INT ,
      col2 BLOB
    )
    TBLPROPERTIES (
      "table.format.version"="2" 
    );
    
    -- 資料寫入
    INSERT INTO blob_table2 VALUES (1, to_blob(repeat('aaa', 1000), 'application/json'));
    
    -- 資料讀取
    SELECT col1,read_blob(col2) FROM blob_table2;
  2. 查看儲存資訊

    SELECT
      get_json_object(GET_BLOB_METADATA(col2), '$.storage_type'),
      get_json_object(GET_BLOB_METADATA(col2), '$.blob_storage_tier')
    FROM blob_table2;
    
    -- 返回結果如下。
    +-----+-----+
    | _c0 | _c1 |
    +-----+-----+
    | PANGU | STANDARD |
    +-----+-----+

和其他函數如何配合

  • 和 to_blob配合:驗證構造出的 blob 是否帶上預期中繼資料。

  • 和 LENGTHB 配合:校正 metadata 中的長度是否與位元組長度一致。

  • 和 read_blob 配合:一個看內容本身,一個看內容描述資訊。

  • 和 GET_JSON_OBJECT 配合:這是最常見、最推薦的使用方式。