非结构化数据(Object Table)

HologresV4.0版本开始,支持通过Object Table访问数据湖OSS中的非结构化数据及其元信息,本文为您介绍Object Table的使用语法以及示例。

介绍

在人工智能时代,非结构化数据已成为驱动技术革新与智能进化的核心燃料。相较于传统数据库中的结构化信息,非结构化数据,如文本、图像、语音、视频、社交媒体内容等以原始、多元的形态承载更加真实的行为轨迹和复杂语义。通过对非结构化数据的处理、分析,可以帮助企业构建更强的竞争优势,让数据发挥更大的价值。Object Table具备的能力如下:

  • 支持通过表的形式读取OSS中非结构化数据(PDF、IMAGE、PPT等)。

  • 可以结合Dynamic Table增量刷新+Embedding Function对非结构化数据加工,既能对非结构化数据Embedding存储进Hologres,无需调用外部Embedding算法,也能增量识别文件变化,从而减少重复计算,提升计算效率。

  • 可以结合AI Function(如ai_gen等)对非结构化数据推理、分类等,也可以结合向量检索、全文检索对非结构化数据双路召回,实现非结构化数据的分析和搜索能力。

通过Hologres Object Table结合AI Function等能力,数据不用出库,无需调用外部服务,就可以实现oss上非结构化数据的全链路加工、检索、分析,在提升数据安全性的同时也能拓宽业务的数据分析范围。

使用限制

  • Hologres V4.0及以上版本支持该功能。

    说明

    如果您的实例是V4.0以下版本请参见实例升级

  • Object Table仅支持读取PDF、PPT以及图片等数据,不支持读取视频和音频。

语法

创建Object Table

  • Object Table一种专为读取非结构化数据而设计的表,因此在建表时无需指定列,Object Table有固定的列。

  • 创建完Object Table后,必须执行一次刷新Object Table才会有数据。

CREATE OBJECT TABLE [IF NOT EXISTS] [schema_name.]<table_name>
WITH (
  -- object table特有属性
  path = '<oss_path>',                           --必填
  oss_endpoint = '<oss_endpoint>',           --必填
  role_arn = '<role_arn>',                   --必填
  
  -- 通用参数
  [orientation = '[column | row | row,column]',]
  [table_group = '[tableGroupName]',]
  [distribution_key = 'columnName[,...]]',]
  [clustering_key = '[columnName{:asc}] [,...]]',]
  [storage_mode = '[hot | cold]',]
  [event_time_column = '[columnName [,...]]',]
  [bitmap_columns = '[columnName [,...]]',]
  [dictionary_encoding_columns = '[columnName [,...]]',]
  [time_to_live_in_seconds = '<non_negative_literal>']
);
  • 基本参数说明

    参数名

    是否必填

    描述

    path

    文件所在的OSS路径目录,Object Table会对该目录的文件进行元数据抽取。例如: oss://bucket/dir

    oss_endpoint

    OSSEndpoint,仅支持经典网络,每个Region的域名详细见OSS地域和访问域名。例如:oss-cn-hangzhou-internal.aliyuncs.com

    role_arn

    阿里云RAM角色的ARN,例如 acs:ram::role-id:role/role-name。您可登录RAM控制台,在身份管理 > 角色页面,单击目标角色名称,获取对应角色的RAM信息。关于阿里云RAM角色的权限配置,详情请参见账号准备

  • 通过参数说明

    以下参数均为非必填。

    参数名

    描述

    默认值

    orientation

    Object Table存储格式,支持行存、列存、行列共存。详情请参见表存储格式:列存、行存、行列共存

    column

    table_group

    Object Table所在的Table Group

    default Table Group

    distribution_key

    分布键Distribution Key

    object_uri

    clustering_key

    聚簇索引Clustering Key

    object_uri

    storage_mode

    存储模式,支持hot(热存储)和cold(冷存储)。详情请参见数据分层存储

    hot

    event_time_column

    分段键。详情请参见Event Time Column(Segment Key)

    last_modified_at

    bitmap_columns

    位图索引Bitmap

    object_uri:auto,etag:auto

    dictionary_encoding_columns

    比特编码。详情请参见字典编码Dictionary Encoding

    object_uri:auto,etag:auto

    time_to_live_in_seconds

    表数据生命周期。

    3153600000

查看Object Table

查询Object Table

Object Table创建成功后,可以像查询普通表一样对该表进行查询。

SELECT * FROM <OBJECT_TABLE_NAME>;

Object Table的字段固定,详细的字段和说明如下:

列名

类型

描述

object_uri

TEXT

映射的具体的OSS文件路径。

etag

TEXT

ETag在每个Object生成时创建,具备唯一性,用于识别一个具体的文件内容。

file

FILE

FILE为新支持的类型,其格式类似于json,用于存储详细的元数据信息,可以使用JSON函数解析。其内容包括:

  • object_uri:object的路径。

  • etag:唯一的object 识别符。

  • size:文件大小。

  • last_modified_at:最后的修改时间。

  • owner_name:文件所属的Owner。

  • object_source:OSS。

  • oss_endpoint:映射的OSS Endpoint。

  • object_table_id:对应的Object Table ID。

  • role_arn:对应的ARN。

metadata

JSON

自定义metadata。

查看object table的表结构

  • 通过hg_dump_script查看

    SELECT hg_dump_script('[<schema_name>.]<object_table_name>');
  • 通过hologres.hg_table_properties系统表查看

    SELECT * FROM hologres.hg_table_properties WHERE table_name = '<object_table_name>';

刷新Object Table

Object Table创建后,必须执行一次刷新才会有数据。当前仅支持手动刷新Object Table。语法如下:

REFRESH OBJECT TABLE [<schema_name>.]<table_name>;

修改Object Table

仅支持修改Object Table的表名和schema,语法如下:

--重命名表名
ALTER OBJECT TABLE [IF EXISTS] <table_name> RENAME TO <new_name>;
--修改schema
ALTER OBJECT TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;

删除Object Table

--开启表回收站后,删除的object table会自动进入回收站。
DROP OBJECT TABLE [IF EXISTS] <table_name> [FORCE];

如果数据库开启了回收站,删除Object Table会进入回收站,可以使用回收命令将Object Table恢复,恢复出来仍然是Object Table,详细使用见表回收站

使用示例

本次以通过Object Table解析PDF文档示例,操作步骤如下。

准备工作

  • 数据准备

    1. 下载博金大模型挑战赛-金融千问14b数据集80份招股书(PDF)。

    2. 登录OSS管理控制台创建Bucket并将已下载的PDF文件上传至该Bucket路径下。上传操作详情,请参见简单上传

  • 账号准备

    1. 登录RAM控制台,创建阿里云RAM角色并授予OSS的相关权限。

      推荐授予AliyunOSSReadOnlyAccess权限。

    2. 为上述阿里云RAM角色添加登录和Hologres的访问权限。

      • 阿里云账号(主账号)

        修改RAM角色的信任策略。重点需更新如下参数:

        • Action:更新为sts:AssumeRole

        • Service:更新为hologres.aliyuncs.com

        {
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                "RAM": [
                  "acs:ram::1866xxxx:root"
                ],
                "Service": [
                  "hologres.aliyuncs.com"
                ]
              }
            }
          ],
          "Version": "1"
        }
      • RAM用户(子账号)

        1. RAM用户授权。

          1. 权限管理 > 权限策略页面,单击创建权限策略,并选择脚本编辑模式创建权限策略。具体操作,请参见创建自定义权限策略

            Hologres可通过该策略判断当前RAM用户是否具备创建对应RAM角色的权限。权限策略内容如下。

            {
              "Version": "1",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": "hologram:GrantAssumeRole",
                  "Resource": "<arn账号>"
                }
              ]
            }
          2. 身份管理 > 用户页面,单击目标RAM用户操作列中的添加权限,为RAM用户(子账号)授予上述步骤已创建的权限策略。具体操作,请参见RAM用户授权

        2. 为已创建的RAM角色授权。

          修改RAM角色的信任策略。重点需更新如下参数:

          • Action:更新为sts:AssumeRole

          • Service:更新为hologres.aliyuncs.com

          {
            "Statement": [
              {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                  "RAM": [
                    "acs:ram::1866xxxx:root"
                  ],
                  "Service": [
                    "hologres.aliyuncs.com"
                  ]
                }
              }
            ],
            "Version": "1"
          }
  • Hologres实例准备

    1. 购买Hologres

      确保Hologres实例版本为V4.0及以上版本。

    2. 创建数据库

操作步骤

  1. 连接HoloWeb,并创建Object Table关联OSS中的PDF文件。

    CREATE OBJECT TABLE public.pdf_bs_challenge_financial_14b_dataset
    WITH (
      path = 'oss://xxxx-hangzhou/bs_challenge_financial_14b_dataset/pdf',                           --必填
      oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',        
      role_arn = 'acs:ram::xxx:role/xxxx'                        
    );
  2. 刷新并查询Object Table。

    Object Table创建成功后必须要手动刷新一次,才能查询数据。执行如下命令。

    -- 刷新
    REFRESH OBJECT TABLE public.pdf_bs_challenge_financial_14b_dataset;
    -- 查询
    SELECT object_uri  ,etag, file->>'size' AS size, file->>'last_modified_at' as last_modified_at FROM public.pdf_bs_challenge_financial_14b_dataset;

    查询的返回结果如下。

      object_uri        |      etag       |   size   |    last_modified_at    
    ---------------------------------------------------------------------------------
     oss://hm-****-hangzhou/bs_challenge_financial_14b_dataset/pdf/5c2707b186a798118bba251cce8d1fc331b****.PDF | 836F504F63F4B77A2271CD3285DDECF7 | 4170245  | 2025-08-18 14:18:19+08
     oss://hm-****-hangzhou/bs_challenge_financial_14b_dataset/pdf/72103a0ef6299585cdd09751682534d873f****.PDF | 39DA597D83BBCA571AC8B94CC464CDC8 | 4022782  | 2025-08-18 14:17:05+08
  3. 非结构化数据检索。

    Object Table可以将PDF的元数据信息一一映射,通常可以结合Hologres AI Function,对PDF的内容进行检索和推理,详细的操作步骤如下:

    1. 购买AI资源

      本文购买AI资源规格为:large-96core-512G-384G、一个节点。

    2. 部署模型并分配资源

      AI资源购买成功后,前往Hologres管控台部署模型,本次PDF检索需要部署的模型以及资源分别如下:

      模型名称

      模型类别

      模型作用描述

      单副本CPU

      单副本内存

      单副本GPU

      资源副本数

      to_doc

      ds4sd/docling-models

      PDF转换成文档。

      20 core

      100 G

      1卡(48 G)

      1

      chunk

      recursive-character-text-splitter

      文档切片,每个PDF较大,建议使用切片。

      15 core

      30 G

      0卡(0 G)

      1

      pdf_embed

      BAAI/bge-base-zh-v1.5

      文档Embedding。

      7 core

      30 G

      1卡(96 G)

      1

      llm

      Qwen/Qwen3-32B

      使用大模型对检索出的文档内容按照提示词推理。

      7 core

      30 G

      1卡(96 G)

      1

    3. 创建一张表对PDF数据进行Embedding。

      创建一张Hologres内部表,用于存储PDF经过Embedding后的数据,并且为这张表构建向量索引,以便后续的向量检索。

      --创建embeding表
      CREATE  TABLE public.embed_pdf_bs (
          object_uri text NOT NULL,
          etag text NOT NULL,
          chunk text NOT NULL,
          embedding_vector float4[] CHECK(array_ndims(embedding_vector) = 1 AND array_length(embedding_vector, 1) =1024)
      ) WITH (
      bitmap_columns = 'object_uri,etag,chunk',
      clustering_key = 'object_uri,etag',
      distribution_key = 'object_uri',
      vectors = '{
            "embedding_vector": {
              "algorithm": "HGraph",
              "distance_method": "Cosine",
              "builder_params": {
              "base_quantization_type": "sq8_uniform",
              "max_degree": 64,
              "ef_construction": 400,
              "precise_quantization_type": "fp32",
              "use_reorder": true
              }
            }}'
            );

      调用AI FunctionPDF进行EmbedChunk,然后写入该表。

      --将PDF转成文档并embed
      insert into public.embed_pdf_bs 
        WITH parsed_doc AS (
          SELECT object_uri, etag, ai_parse_document(file, 'auto', 'markdown') AS doc 
          FROM pdf_bs_challenge_financial_14b_dataset limit 1), 
        chunked_doc AS (
          SELECT object_uri, etag, unnest(ai_chunk(doc, 300, 50)) AS chunk 
          FROM parsed_doc )
        SELECT object_uri, etag, chunk, ai_embed(chunk) AS embedding_vector 
        FROM chunked_doc
        WHERE chunk IS NOT NULL AND length(chunk) > 0;
    4. PDF的内容进行检索和推理。

      可以根据招股书中的业绩走势,来判断该公司的后续走势是悲观还是乐观,对投资意向提供辅助建议。示例SQL如下:

      WITH
        -- 问题向量与召回
        embedding_recall AS (
          SELECT chunk FROM embed_pdf_bs
          ORDER BY
          approx_cosine_distance(
            embedding_vector,
            ai_embed('报告期内,湖南国科微电子股份有限公司2014年度、2015年度、2016年度营业收入和净利润分别较上年增长多大幅度?')
          ) DESC
          LIMIT 20
        ),
        -- 拼接
        concat_top_chunks AS (
          SELECT string_agg(chunk, E'\n\n----\n\n') AS merged_chunks FROM embedding_recall
        )
      -- 生成最终回答
      SELECT
        ai_gen('请分析如下业绩走势是悲观还是乐观,并给出原因:' ||
               ai_gen('报告期内,湖南国科微电子股份有限公司2014年度、2015年度、2016年度营业收入和净利润分别较上年增长多大幅度?'  || merged_chunks))
      FROM concat_top_chunks;
      

      查询的返回结果如下。

      ai_gen
      ----
      "从提供的财务数据和增长原因分析来看,湖南国科微电子股份有限公司在2014年至2016年期间的业绩走势整体上是**乐观的**,原因如下:
      
      ### 1. **营业收入持续增长**
      - 2014年营业收入同比增长112.94%,2015年同比增长103.00%,2016年虽然增速放缓,但仍保持33.22%的增长。这表明公司业务规模在不断扩大,市场需求稳步提升。
      - 增长的主要原因是新产品(如智能监控芯片、GK系列芯片)的量产和销售,以及与知名代理商的合作,显示出公司在产品创新和市场拓展方面的优势。
      
      ### 2. **净利润显著增长**
      - 2014年净利润同比增长高达467.53%,2015年增长8.21%,2016年再次增长33.07%。虽然2015年增速较慢,但整体仍保持正向增长。
      - 2016年净利润增长的主要原因是高毛利产品(如固态存储系列芯片)收入增加,同时销售费用下降,说明公司在产品结构优化和成本控制方面取得了积极成效。
      
      ### 3. **产品结构优化和技术创新**
      - 2014年,公司因直播星市场开放而受益;2015年,智能监控芯片实现量产销售;2016年,GK系列芯片开始导入知名代理商。这表明公司能够紧跟市场需求,通过技术创新推动业务增长。
      - 高毛利产品的销售占比增加,有助于提升公司整体盈利能力。
      
      ### 4. **市场拓展能力增强**
      - 与业内知名代理商(如科通、时捷)的合作,说明公司在市场渠道建设方面取得了突破,有助于扩大市场份额和提升品牌影响力。
      
      ### 5. **整体趋势积极**
      - 尽管2016年营业收入增长较2015年有所放缓,但净利润仍保持较高增速,显示出公司经营效率的提升和盈利能力的增强。这表明公司在面对市场变化时具备较强的适应能力和优化能力。
      
      ### 结论:
      综合来看,湖南国科微电子股份有限公司在2014年至2016年期间的业绩走势是**乐观的**。公司不仅实现了营业收入和净利润的持续增长,而且通过产品结构优化、技术创新和市场拓展,增强了自身的核心竞争力和盈利能力。尽管2016年营业收入增速有所放缓,但净利润的稳定增长显示出公司具备良好的经营管理和成本控制能力。"