文章目录
数据湖技术
Apache Iceberg
Iceberg是一个通用的表格式(数据组织格式),它可以适配Presto,Spark等引擎提供高性能的读写和元数据管理功能。
Schema
SQL关系模型:要求数据预先定义好Schema(有哪些表,每张表有哪些列,每一列的类型是什么),然后按照定义好的Schema去写数据。
文档模型:对于数据Schema的要求非常灵活,每条数据就是一个文档,文档内部的数据格式不做严格限定。
对数据模型的限制,反过来也会成为一种对灵活性的束缚。在大数据场景中,半结构化、无结构化的数据是非常常见的,因此也催生了 Schema-on-Write 和 Schema-on-Read 两种不同的处理方式。
Schema-on-Read(场景更灵活)
指的是原始数据在写入的时候不做过多的校验。而在查询之前,再去按照查询分析的需求去定义一个Schema并分析(动态决定以何种视角看待数据),类似在数据之上按需建立一个视图。这种方式显然更灵活,但相应的性能上会一般会打一些折扣。
步骤
1.基于查询语句的语义推断
从用户输入的SQL语句中自动推断出所需要的Schema。
用户提交SQL查询时,系统首先对语句进行词法分析和语法解析,生成抽象语法树(AST)。
通过遍历语法树提取投影字段(SELECT子句)、过滤条件(WHERE子句)等关键信息,直接推断出查询所需的字段名及类型。
eg:对于SELECT id, login_time FROM logs WHERE status=200,系统会从语法树中识别需要提取id、login_time和status三个字段,并根据status=200的等值判断初步推断status为数值类型
2.动态数据内容解析
针对半结构化数据,系统在读取原始数据时,按需解析其内部结构。
JSON数据:递归解析嵌套字段,自动识别键值对并映射为临时列。
日志行:通过正则匹配或分隔符拆分,提取键值对形式的字段。
若数据中存在多态结构(如某字段在不同记录中类型不同),系统会根据实际值动态转换类型(如将混合的字符串和数值统一为字符串)。
3.运行时类型推导
字段类型并非预先定义,而是在计算过程中根据数据内容和操作语义动态确定。
若字段参与算术运算(如SUM(price)),则尝试将其解析为数值类型。
若字段用于字符串函数(如SUBSTR(title,1,5)),则强制作为字符串处理。
对于无法明确推断类型的场景(如未参与运算的纯投影字段),默认采用兼容性更高的类型(如VARCHAR)。
4.容错与缺省处理
当查询字段在部分数据中不存在时,系统会填充NULL值而非报错,保证查询可执行。
对于嵌套结构(如JSON数组),通过列式展开(Flatten)自动生成多行记录,无需预先定义嵌套关系
Schema-on-Write(性能更高):对应关系模型
数据的Schema是预先定义好的。数据在写入数据仓库之前,必须要按照定义好的Schema去写入。如果原始数据不符合定义的Schema,则需要先通过一些ETL的过程去对数据进行清洗加工,然后再写入。数据写入的同时,往往能够根据确定的Schema建立一些索引结构,查询的时候也同样直接按照确定的Schema去查询,往往能够获得较好的查询性能。
创建字段索引的时候,指定了有哪些字段,每个字段是什么类型,相当于创建了一个关系模型的Schema。
字段索引开启统计后,会为字段构建列存,从而在执行时可以高效读取指定列的数据。
没有索引也能用SQL ?深度解析 SLS Schema-on-Read 分析原理与应用
面向异构数据的Schema-on-Read分析技术设计与实践