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 | 業務寫入的內容類型。常見用途:
|
content_length | blob 內容位元組數。比如:
|
checksum | 內容校正值欄位,可用於輔助判斷內容或儲存物件是否一致;當沒有對應值時,結果為 |
is_compressed | 是否壓縮儲存。現有 case 只能說明:
不建議僅根據當前 case 推導完整壓縮規則。 |
content_encoding | 壓縮編碼名稱。
|
storage_type | 儲存類型資訊,適合在排查 blob 儲存形態時查看。 |
blob_storage_tier | 儲存層級資訊;若沒有對應值,則返回 |
輸入參數與傳回值中的 NULL 說明
輸入參數為
NULL或空 blob 時以下情境下,
GET_BLOB_METADATA(blob_expr)的返回結果為NULL入參本身為
NULLblob 為空白內容
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:未指定內容類型時為NULLchecksum:沒有對應校正值時為NULLcontent_encoding:未壓縮時為NULLblob_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 |
+------------+------------+檢查持久化後的壓縮情況
準備測試表
-- 建立包含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;查詢壓縮情況
SELECT get_json_object(GET_BLOB_METADATA(col2), '$.is_compressed') FROM blob_table2; -- 返回結果如下。 +-----+ | _c0 | +-----+ | true | +-----+is_compressed可理解為“該 blob 當前是否以壓縮形式儲存”。
查看壓縮編碼
準備測試表
-- 建立包含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;查看壓縮編碼
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 名稱
查看儲存相關資訊
準備測試表
-- 建立包含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;查看儲存資訊
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 配合:這是最常見、最推薦的使用方式。