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 配合:这是最常见、最推荐的使用方式。