StarRocks inspect_hive_part_info 函数详解:以 JSON 方式查看 Hive 外表分区元数据 📅 发布时间:2026/9/19 4:09:50 👁 浏览次数: StarRocks inspect_hive_part_info 函数详解以 JSON 方式查看 Hive 外表分区元数据【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksinspect_hive_part_info是 StarRocks 提供的一类元数据Meta内省函数用于在 SQL 会话中直接获取指定 Hive 外部表External Table的分区信息并以 JSON 字符串的形式返回。它在排查外表分区元数据不一致、验证分区统计信息、检查数据文件可拆分性等场景中非常实用。读完本文你将掌握该函数的完整语法、JSON 返回结构的每个字段含义、底层实现调用链以及在实际查询与排障中的用法。函数概览inspect_hive_part_info属于 StarRocks FE 端注册的常量函数Constant Function定义在 MetaFunctions.java 中通过ConstantFunction注解注册isMetaFunction true表明它是一个元数据内省函数。其完整函数签名为inspect_hive_part_info(table_name)项目说明函数名inspect_hive_part_info参数table_nameVARCHAR 类型目标表的名字必须使用完整的catalog.database.table三段式名称例如hive0.partitioned_db.lineitem_par返回类型VARCHAR包含 Hive 分区信息的 JSON 字符串函数类型元数据内省函数Meta Function只读、不触发查询执行属于常量折叠Constant Folding范畴适用对象通过 External Catalog 接入的 Hive 外部表分区表参数table_name在源码中通过TableName.fromString(name.getVarchar())解析因此传入时必须携带 Catalog 名与库名。下面的调用链分析中可以看到函数内部会依次完成“表解析 → 权限校验 → 分区信息获取 → JSON 序列化”四个步骤。返回结果JSON 结构逐字段解析原文档给出的示例完整展示了该函数的真实输出。以一个 Hive 分区表t1分区键为k3、k4为例mysql select inspect_hive_part_info(t1); ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | inspect_hive_part_info(t1) | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | {k39999-12-03/k43:{parameters:{totalSize:625,numRows:1,starrocks_version:bc39130-bc39130,numFiles:1,starrocks_query_id:0197ca18-dd10-76fd-bb85-253226af8365,transient_lastDdlTime:1751442316,STATS_GENERATED_VIA_STATS_TASK:workaround for potential lack of HIVE-12730},inputFormat:PARQUET,textFileFormatDesc:{},fullPath:hdfs://emr-header-1.cluster-49091:9000/user/hive/warehouse/hive_db_b4425ea7d8184049a2b1e039c0a8f595.db/t1/k39999-12-03/k43,isSplittable:true}} | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 row in set (0.00 sec)返回的是一个 JSON 对象键为分区名形如k39999-12-03/k43值为该分区对应的Partition对象序列化结果。分区名的格式与 Hive 的分区目录规范一致多个分区会并列输出为多个键值对。从 Partition.java 的toJson()实现可以看出每个分区的 JSON 值固定包含五个字段JSON 字段类型含义示例parameters对象该分区的参数 / 统计信息集合来源于 Hive 元数据Metastore{totalSize:625,numRows:1,numFiles:1,transient_lastDdlTime:1751442316}inputFormat字符串该分区数据文件的输入格式如PARQUET、ORC、TEXT等PARQUETtextFileFormatDesc对象文本格式文件的附加描述分隔符、转义符等非文本格式时通常为空对象{}{}fullPath字符串该分区在文件系统上的完整路径直接对应 Hive 分区目录hdfs://.../t1/k39999-12-03/k43isSplittable布尔值该分区数据文件是否可拆分影响并发扫描的并行度trueparameters 字段的常见统计项parameters中的键值对直接透传自 Hive Metastore 的分区参数Partition Parameters实际内容取决于 Hive 侧统计任务的执行情况常见的包括totalSize分区数据总大小字节numRows分区预估行数numFiles分区文件个数transient_lastDdlTime最近一次 DDL 变更的 Unix 时间戳starrocks_version/starrocks_query_id当分区由 StarRocks 写入或统计时StarRocks 附加的版本与查询标识STATS_GENERATED_VIA_STATS_TASKHive 统计任务生成标记示例中的 value 与 Hive 的 HIVE-12730 问题 workaround 相关。这些统计项正是 Hive 分区裁剪、CBO 优化器估算行数与扫描代价的重要输入因此通过该函数可以直观地核对外表分区统计信息是否齐全、是否过期。底层实现函数调用链与权限校验从 FE 源码看inspect_hive_part_info的执行路径非常清晰整个过程不触发数据扫描只访问元数据开销极小表名解析与元数据获取inspectHivePartInfo首先用TableName.fromString解析三段式表名随后调用 MetaFunctions.inspectExternalTable通过GlobalStateMgr.getCurrentState().getMetadataMgr().getTable(...)从 Metadata Manager 中拿到Table对象若表不存在会抛出ERR_BAD_TABLE_ERROR语义异常。权限校验inspectExternalTable内部调用Authorizer.checkAnyActionOnTable检查当前用户对目标表的任意操作权限无权限时上报访问拒绝Access Denied异常。即该函数要求用户对目标表拥有至少一种操作权限。分区信息获取通过PartitionUtil.getPartitionNameWithPartitionInfo(table)获取“分区名 → PartitionInfo”的映射该工具方法定义在 PartitionUtil.java内部会依据表类型构建对应的ConnectorPartitionTraits实现Hive 表对应 HivePartitionTraits.java。这一层抽象意味着该框架同样适用于其他带分区语义的外部数据源。JSON 序列化遍历映射仅对类型为Partition的条目调用part.toJson()if (entry.getValue() instanceof Partition)做了类型过滤最终把所有分区合并为一个 JSON 对象返回。由于该函数是常量函数在查询计划生成阶段即被求值折叠Constant Folding因此它也可以嵌入SELECT投影之外的表达式中使用。使用示例1. 查看 Hive 分区表的全部分区元数据-- 使用三段式完整表名catalog.database.table SELECT inspect_hive_part_info(hive_catalog.my_db.sales_partitioned);2. 在函数结果上做 JSON 解析提取关键字段-- 借助 JSON 函数解析返回结果提取每个分区的完整路径 SELECT JSON_KEYS(inspect_hive_part_info(hive_catalog.my_db.sales_partitioned)) AS partition_keys; -- 提取指定分区的数据大小 SELECT JSON_QUERY( inspect_hive_part_info(hive_catalog.my_db.sales_partitioned), $.dt2024-01-01.parameters.totalSize ) AS total_size;注意分区名作为 JSON 键包含与/等字符使用JSON_QUERY路径时需要加反引号包裹键名。3. 配合 WHERE 条件进行针对性排查SELECT inspect_hive_part_info(hive_catalog.my_db.sales_partitioned) WHERE JSON_LENGTH(inspect_hive_part_info(hive_catalog.my_db.sales_partitioned)) 0;典型使用场景外表分区元数据排障当查询 Hive 外表结果与预期不符、分区裁剪异常时用该函数确认 FE 侧元数据缓存中实际识别到的分区列表快速区分“Metastore 侧缺分区”与“StarRocks 缓存未刷新”两类问题统计信息核对通过parameters字段核对numRows、totalSize、numFiles等统计信息辅助判断优化器估算是否准确、是否需要执行 ANALYZE文件格式与可拆分性检查通过inputFormat与isSplittable判断分区数据能否被并行拆分扫描从而评估查询并发度与性能预期自动化运维与监控脚本作为只读的元数据内省手段可在脚本中周期性采集分区规模、路径分布等指标。注意事项与限制必须使用三段式表名table_name需要是catalog.database.table形式否则表解析会失败并抛出语义异常对应错误码ERR_BAD_TABLE_ERROR仅适用于外部表从函数名与实现看它面向 Hive 外部表的分区信息普通内部表应使用分区相关的系统函数如inspect_table_partition_info见 meta-functions 目录需要目标表的操作权限无权限用户调用会收到 Access Denied这是 FE 侧Authorizer的强制校验返回的是元数据快照结果基于当前 FE 内存中的元数据状态可能来自缓存若 Hive 侧刚变更分区可能需要刷新缓存后才能看到最新结果返回结果可能较大分区数量很多时 JSON 字符串会很长建议在交互式排查中使用或配合 JSON 解析函数只提取所需字段。测试与验证FE 单元测试 ConstantExpressionTest.java 的testInspectHivePartitionInfo覆盖了两个关键行为对不存在的表not_exist_catalog.no_db.no_table调用会抛出StarRocksPlannerException验证表不存在时的报错路径对真实 Hive 表hive0.partitioned_db.lineitem_par调用后执行计划包含Project节点验证常量折叠后该函数被正常求值并输出。这组测试用例可作为你本地验证函数行为、理解其错误语义的参考入口。小结inspect_hive_part_info是 StarRocks 元数据内省函数家族inspect_*完整列表见 meta-functions 文档目录中面向 Hive 外表分区的专用工具。它以极低的成本仅元数据访问、无数据扫描将 Hive 分区名、统计参数、输入格式、文件路径与可拆分性等关键信息以结构化 JSON 暴露给 SQL 层既是日常外表查询排障的利器也是理解 StarRocks 外表分区元数据管理机制的绝佳窗口。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考