Doris动态表使用快速入门实战

在这里插入图片描述

1. 动态表构功能概述

半结构化数据,是介于结构化和非结构化之间的数据。和普通纯文本相比,半结构化数据具有一定的结构性。和结构化数据相比,其结构变化复杂,我们又不能方便的使用结构化的方式去描述它。
半结构的数据中通常即包括数据本身,也包括数据结构的描述。比如场景的有JSON、XML,他们即包含数据,也包含数据的描述(元数据信息),具体半结构化特征如下:

  • 数据结构自描述:结构与数据相融合在一起,一条数据即包括“元数据”也包括“数据”。
  • 数据结构复:数据结构难以纳入现有的各种描述框架,实际应用中不易进行清晰的理解与把握。
  • 数据结构描述的动态性:数据变化通常会导致结构模式变化,整体上具有动态的结构模式。
    相对于结构化数据,半结构化数据的构成更为复杂和不确定,从而也具有更高的灵活性,能够适应更为广泛的应用需求。

2. Doris 半结使用场景

  1. 使用动态表解决数据结构复杂多变问题
  2. 动态表可以对实时接入的JSON数据进行解析,并根据数据中的scheme信息对SelectDB表中的表结构进行动态维护。动态Scheme维护有如下原则:
  • 导入的数据类型只支持JSON
  • 动态Scheme Change支持添加列
  • 支持字段自动多层级展开
  • 支持严格模式

3. Doris动态表使用实战

  1. 按照如下表结构创建一个表:
CREATE TABLE `httplogs` (
  `@timestamp` int(11) NULL COMMENT "",
  `clientip` varchar(20) NULL COMMENT "",
  `request` text NULL COMMENT "",
    ...
) ENGINE=OLAP
DUPLICATE KEY(`@timestamp`,`clientip`)
PARTITION BY RANGE(`@timestamp`)()
DISTRIBUTED BY HASH(`clientip`) BUCKETS 12
  1. 写入JSON数据
    向Doris中写入如下1条数据:
{"@timestamp":1676012713,"clientip":"192.168.1.1","request":"test"} 
  1. 添加uuid 列:
{
   "@timestamp":1676012713,
   "clientip":"192.168.1.1",
   "request":"test",
   "uuid":1
}

将上面数据写入Doris,Doris发现JSON数据比之前多了一列uuid,该列的数据类型为为int。此时Doris会自动将一个字段名称为uuid,字段类型为int的列维护到Doris表结构中。因此表结构变为:

CREATE TABLE `httplogs` (
  `@timestamp` int(11) NULL COMMENT "",
  `clientip` varchar(20) NULL COMMENT "",
  `request` text NULL COMMENT "",
   `uuid` int  COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`@timestamp`,`clientip`)
PARTITION BY RANGE(`@timestamp`)()
DISTRIBUTED BY HASH(`clientip`) BUCKETS 12
  1. 多层嵌套数据自动展开:加入如下复杂结构数据
{
   "@timestamp":1676012713,
   "clientip":"192.168.1.1",
   "request":"test",
   "uuid":"2",
   "response":{
      "status":0,
      "msg":"",
      "data":{
         "apraise":"0",
         "favorite":"0",
         "comments":"2",
         "pv":202
      }
   }
}

写入上述数据,SelectDB会自动将response列以及其中的JSON数据进一步展开并进行元数据的维护。修改后的表结构为:

CREATE TABLE `httplogs` (
  `@timestamp` int(11) NULL,
  `clientip` varchar(20) NULL,
  `request` text NULL,
  `uuid` int(11) NULL COMMENT 'auto change 2023-02-14T15:53:10+08:00[Asia/Shanghai]',
  `response.status` int(11) NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]',
  `response.msg` text NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]',
  `response.data.apraise` text NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]',
  `response.data.favorite` text NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]',
  `response.data.comments` text NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]',
  `response.data.pv` int(11) NULL COMMENT 'auto change 2023-02-14T15:56:41+08:00[Asia/Shanghai]'
) ENGINE=OLAP
DUPLICATE KEY(`@timestamp`, `clientip`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`clientip`) BUCKETS 12
PROPERTIES (
"persistent" = "false"
);
  1. 数据访问与查询:多级嵌套子JSON访问使用点号(.)隔开,字段上需要加`,例如:
select * from httplogs where `response.data.pv` ="202";

你可能感兴趣的:(大数据,数据库,apache,Doris)