大数据开发词典:概念原理等(持续更新)

DBeaver 中 新建数据库连接 和 从JDBC URL新建连接,有什么区别


新建数据库连接(常规方式)

使用场景:大多数情况下的首选方式

特点

  • 可视化配置:通过表单填写主机、端口、用户名、密码等字段

  • 自动生成 JDBC URL:DBeaver 根据你填写的参数自动构建连接字符串

  • 驱动管理:DBeaver 自动下载和管理合适的 JDBC 驱动

  • 更友好:不需要手动编写复杂的 JDBC URL,适合不熟悉 JDBC 格式的用户

操作流程

text

复制代码
选择数据库类型 → 填写表单(主机/端口/用户名/密码)→ 测试连接 → 完成

📌 从 JDBC URL 新建连接(高级方式)

使用场景:需要精确控制连接参数时

特点

  • 手动输入 URL:直接编写完整的 JDBC 连接字符串

    text

    复制代码
    例如:jdbc:hive2://172.18.230.242:10000/default;auth=noSasl
  • 精确控制:可以添加额外的连接参数(如认证方式、超时设置等)

  • 需要专业知识:必须知道正确的 JDBC URL 格式

  • 跳过表单:不需要分别填写主机、端口等字段

适用情况

  • 使用特殊的 JDBC 驱动或版本

  • 需要添加表单中没有的高级参数

  • 从其他工具复制已有的连接配置

  • 使用 DBeaver 不原生支持的数据库(但通过通用 JDBC 驱动连接)


🎯 你应该选哪个?

对于你的情况(Hive + 学习使用),选择「新建数据库连接」即可

理由:

  1. Hive 是 DBeaver 原生支持的数据库类型

  2. 可视化表单更直观,不容易出错

  3. 只需要填写 IP、端口、用户名这 3 个字段

  4. DBeaver 会自动处理驱动兼容性问题


📝 如何选择

情况 推荐方式
初学者/常规连接 新建数据库连接
需要添加特殊参数 从 JDBC URL 新建
复制别人的连接配置 从 JDBC URL 新建
连接 DBeaver 不支持的数据库 从 JDBC URL 新建(使用通用 JDBC)

💡 小提示

如果你后续需要添加特殊参数(比如 Hive 的认证方式),可以在「新建数据库连接」方式下,点击 "驱动属性""高级" 选项卡,以键值对形式添加参数,而不需要手动写 JDBC URL。


Hive 版本选择


根据你的 Hive 版本(3.1.3),应该选择 Apache Hive 2


📌 选择说明

选项 适用版本 你的情况
Apache Hive 2 Hive 1.x、2.x、3.x 选这个
Apache Hive 4+ Hive 4.x 及以上 ❌ 版本太高
Apache Kyuubi 腾讯开源的 Kyuubi 服务 ❌ 不是标准 Hive

虽然你的版本是 3.1.3,但 Hive 3.x 的 JDBC 驱动与 Hive 2.x 兼容,DBeaver 的 "Apache Hive 2" 驱动可以正常工作。


⚠️ 一个常见问题

选择 Apache Hive 2 后,DBeaver 会自动下载驱动。但有时候自动下载的驱动版本可能与 Hive 3.1.3 不完全兼容,导致连接时出现类似错误:

text

复制代码
Required field 'client_protocol' is unset

如果遇到这个问题,需要手动更换驱动版本。具体方法是:

  1. 在连接配置窗口点击 "编辑驱动"(通常在左下角)

  2. 切换到 "库" 选项卡

  3. 删除自动下载的驱动,手动添加与 Hive 3.1.3 兼容的 JDBC 驱动包(通常用 hive-jdbc-3.1.3-standalone.jar


为什么要替换?

因为 DBeaver 自动下载的驱动不一定是给你的 Hive Server 用的


📌 具体原因

自动下载的驱动 你本地的驱动
版本 可能是 Hive 2.x 的旧版驱动 Hive 3.1.3 专用驱动 ✅
来源 公共 Maven 仓库(通用版本) 你安装的 Hive 自带的配套驱动
兼容性 可能与 Hive 3.1.3 不完全兼容 完全匹配你的 Hive 版本

DBeaver 的 "Apache Hive 2" 驱动 ,默认下载的是兼容 Hive 2.x/3.x 的通用版本,但实际测试中,用 Hive 3.1.3 自带的 hive-jdbc-standalone.jar 成功率最高,兼容性最好。


✅ 如果自动下载的驱动能用呢?

那就直接用,不用替换!

我的建议是:

  1. 先测试连接:用自动下载的驱动直接点"测试连接"

  2. 如果成功 → ✅ 直接用,什么都不用改

  3. 如果报错 → ❌ 再手动替换成本地驱动


📌 HiveServer2 为什么需要单独重启

1. HiveServer2 是一个独立的 Java 进程

它有自己的 JVM 进程,和 Hadoop 的 NameNode、DataNode 等进程是相互独立的。启动/停止 Hadoop 不会自动控制 HiveServer2 的生命周期。

2. 配置加载时机

HiveServer2 的配置(hive-site.xml)只在启动时加载一次。修改配置后,必须重启 HiveServer2 才能让新配置生效。


HADOOP_HOME/sbin/start-dfs.sh HADOOP_HOME/sbin/start-yarn.s和这样启动 start-hadoop.sh 有什么区别


它们的核心区别在于:启动方式不同,但最终目标一致(都是启动 Hadoop 集群)。


📌 区别对比

对比维度 start-dfs.sh + start-yarn.sh start-hadoop.sh(自定义脚本)
来源 Hadoop 官方自带的启动脚本 你自己或别人写的自定义脚本
启动内容 只启动 Hadoop(HDFS + YARN) 可能包含更多内容(SSH、环境检查、日志等)
灵活性 固定流程,不能修改 完全自定义,可以添加额外步骤
依赖 依赖 SSH 免密登录 可能已经配置好了绕过 SSH 的参数
错误处理 出错时直接报错退出 可能有错误提示、重试等逻辑
适用场景 标准启动方式 简化操作、一键启动全部服务

🔍 你的 start-hadoop.sh 做了什么?

从你之前执行 start-hadoop.sh 的输出来看:

text

复制代码
=========================================
Starting Hadoop Cluster
=========================================
1. Starting SSH service...   ← 额外步骤:启动 SSH
2. Starting Hadoop...        ← 实际启动 Hadoop
3. Waiting 30 seconds...
4. Checking Hadoop processes...
✅ Hadoop is ready!

这个脚本主要做了:

  1. 启动 SSH 服务(避免 SSH 未启动导致 Hadoop 失败)

  2. 调用 start-dfs.shstart-yarn.sh(核心启动)

  3. 等待服务就绪(避免马上检查进程导致显示不全)

  4. 检查进程状态(确认 NameNode、DataNode 等都起来了)

  5. 显示 Web UI 地址(方便访问)


⚙️ 它们的关系

text

复制代码
你的 start-hadoop.sh
        │
        ├── 1. 启动 SSH 服务
        │
        ├── 2. 调用 start-dfs.sh   ← Hadoop 官方脚本
        │
        ├── 3. 调用 start-yarn.sh  ← Hadoop 官方脚本
        │
        ├── 4. 等待 & 检查进程
        │
        └── 5. 显示状态信息

🎯 哪个更好?

情况 推荐
标准环境(SSH 正常) start-hadoop.sh,更便捷,有状态提示
WSL2 环境(SSH 有问题) 直接调用 start-dfs.sh + start-yarn.sh 更可控
需要自定义启动参数 修改 start-hadoop.sh 添加 HADOOP_SSH_OPTS

🚀 建议:优化你的 start-hadoop.sh

既然 WSL2 中 SSH 经常出问题,可以修改脚本绕过 SSH。在脚本开头添加:

bash

复制代码
#!/bin/bash
# 绕过 SSH 检查
export HADOOP_SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=5"
export HADOOP_SSH_CMD=ssh

# ... 后面保持不变

这样既保留了脚本的便利性,又解决了 SSH 的问题。


✅ 现在你可以这样选择

方案一:直接用官方脚本(快速验证)

bash

复制代码
export HADOOP_SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=5"
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
jps

方案二:使用优化后的 start-hadoop.sh

在脚本开头加上 export HADOOP_SSH_OPTS=...,然后执行 ./start-hadoop.sh


WSL2中,SSH 连接和用 Hadoop 的本地模式 有什么区别


理解它们的区别,能帮你明白为什么可以"跳过 SSH"。


📌 核心区别

对比维度 SSH 连接模式 Hadoop 本地模式(无 SSH)
依赖 需要 SSH 服务运行且配置正确 完全不依赖 SSH
通信方式 通过 SSH 协议远程执行命令 直接调用本地 Shell 启动进程
适用场景 多节点集群(正式环境) 单机学习(伪分布式)
可靠性 受网络、防火墙、密钥配置影响 稳定,不受网络影响
WSL2 兼容性 经常出问题(systemd 限制) ✅ 完美兼容

🔍 技术细节

模式一:SSH 连接模式(标准 Hadoop)

Hadoop 通过 SSH 在不同节点之间通信。比如:

bash

复制代码
# start-dfs.sh 内部做的事情
ssh localhost "hadoop-daemon.sh start namenode"   # 启动 NameNode
ssh localhost "hadoop-daemon.sh start datanode"   # 启动 DataNode

为什么需要 SSH?

  • Hadoop 集群可能分布在多台机器上

  • 主节点需要通过 SSH 远程启动从节点的服务

  • 即使单机模式,也默认用 SSH 连接 localhost 来执行命令

缺点

  • SSH 服务必须正常运行

  • 需要配置免密登录

  • 受网络、防火墙影响

  • WSL2 中 SSH 服务不稳定


模式二:本地模式(绕过 SSH)

通过设置环境变量 HADOOP_SSH_OPTS,让 Hadoop 改用本地 Shell 直接启动进程:

bash

复制代码
# 设置后,start-dfs.sh 内部变成
# 直接执行 hadoop-daemon.sh start namenode
# 而不是通过 ssh localhost 去执行

优点

  • 不需要 SSH 服务

  • 不需要配置免密登录

  • 不受 WSL2 systemd 限制

  • 启动更快

缺点

  • ❌ 只能单机运行,不能扩展到多节点集群

  • ❌ 不能模拟真实生产环境


🎯 对你的学习环境意味着什么?

使用场景 是否需要 SSH?
学习 Hive 语法、SQL 查询 ❌ 不需要
创建表、插入数据、查询 ❌ 不需要
学习 Hive 底层原理 ❌ 不需要
学习 Hadoop 集群部署 ✅ 需要
模拟生产环境多节点 ✅ 需要

💡 结论

对于你的本地学习环境,Hadoop 本地模式(绕过 SSH)完全够用!

你是在 WSL2 单机 上学习 Hive,不是在生产环境部署多节点集群。本地模式能帮你:

  1. ✅ 省去 SSH 配置的麻烦

  2. ✅ 更稳定地启动 Hadoop 和 Hive

  3. ✅ 更快地进入学习状态

如果以后需要学习 Hadoop 集群部署,可以专门用多台虚拟机或云服务器来练习,那时再搞 SSH。


Spark Streaming 和 Spark 的关系

可以概括为:Spark Streaming 是构建在 Spark 核心引擎(Spark Core)之上的一个流处理组件,用于处理实时数据流

它们的主要区别体现在处理方式和应用场景上:

  • 处理方式 :Spark 的核心是批处理 引擎,用于处理静态的、有边界的数据集(如HDFS上的历史文件)。而 Spark Streaming 的核心机制是 "微批处理"(Micro-batching)------它会把不间断的实时数据流,按时间间隔(比如1秒)切分成一系列小的数据批次,然后交给底层的 Spark 引擎(Spark Core)作为小批处理作业来执行。因此,它本质上还是批处理,只是间隔非常短,实现了"近实时"的效果。

  • 数据模型 :Spark 编程的核心抽象是 RDD(弹性分布式数据集) ,代表一个不可变的、分区的数据集合。Spark Streaming 的核心抽象是 DStream(离散化数据流),它在内部也由一系列按时间切分的 RDD 序列组成。

  • 适用场景:Spark 适用于对历史数据进行大规模离线分析、ETL等批处理任务。Spark Streaming 则适用于对实时性要求较高的场景,如实时日志监控、金融交易反欺诈、实时推荐等。不过需要注意,由于是微批处理,其延迟通常在秒级,无法达到毫秒级,因此不适用于对延迟极度敏感的应用。

补充说明 :根据Apache Spark官方文档,Spark Streaming已被标记为遗留项目(legacy project) ,官方推荐使用更新的 Structured Streaming 模块来构建流处理应用。Structured Streaming 基于 Spark SQL 引擎,提供了更统一和易用的编程模型。


Spark SQL / PySpark 是什么


Spark SQL 是 Apache Spark 中用于处理结构化数据 的模块,让你可以用 SQLDataFrame API (在 Scala/Java/Python/R 中)来执行数据查询和分析。它的核心是 Catalyst 优化器Tungsten 执行引擎,能把 SQL 语句优化成高效的分布式任务。


PySpark 是 Spark 为 Python 语言提供的编程接口,你可以通过它使用 Python 的 DataFrame API 或直接写 SQL 来操作数据。

一句话概括:

  • Spark SQL :让你在 Spark 上写 SQL 处理海量数据。

  • PySpark :让你在 Spark 上用 Python 写代码处理海量数据。

两者关系是 PySpark 包含了 Spark SQL。在 PySpark 中,spark.sql() 方法就是用来执行 Spark SQL 的。

与其他工具对比:

对比项 Spark SQL / PySpark Hive
本质 分布式计算引擎 + SQL 查询能力 基于 Hadoop 的数据仓库工具
执行引擎 Spark Core(内存计算) MapReduce(磁盘读写,速度慢)
性能 快(充分利用内存和DAG优化) 相对较慢(适合大批量离线处理)
互操作性 可以访问 Hive 表(通过 Hive Metastore) 标准Hadoop生态

在杭州的大数据岗位中,Spark SQL / PySpark 几乎是必考项,用来替代复杂、冗长的 Hive SQL 或 MapReduce 任务,进行高效的数据清洗、聚合和分析。


Hive 执行引擎 MR / Tez / Spark


Hive 支持三种执行引擎:MapReduce (MR)TezSpark


简单来说,Tez 和 Spark 是 MR 的替代者,能显著提升查询性能,其中 Tez 被视为 Hive 复杂查询的优秀通用替代方案,而 Spark 则在极致性能和迭代计算上更胜一筹。


下表从多个维度对比了它们的差异:

对比维度 MapReduce (MR) Tez Spark
核心模型 经典的 Map + Reduce 两阶段模型。 有向无环图 (DAG) 模型,能将多个MR任务合并为一个图。 内存计算 + DAG 模型,基于弹性分布式数据集(RDD)。
中间结果处理 每次Map和Reduce后,中间结果必须写入磁盘(HDFS),导致大量磁盘I/O。 尽可能减少磁盘读写,通过内存、本地磁盘或高效网络在任务间传递数据,仅必要时落盘。 优先缓存于内存,极大减少磁盘I/O,迭代计算优势明显。
任务启动开销 每个任务独立启动JVM,开销大 支持容器重用,避免重复启动JVM,减少开销。 长期驻留的Executor进程,任务启动快
性能特点 最慢,高延迟,资源利用率低。适合简单的、对延迟不敏感的批处理任务。 性能显著优于MR,能将复杂查询延迟降低50%以上。 在迭代计算和CPU密集型场景下性能最佳。但处理小数据集时可能因调度开销导致性能下降。
适用场景 历史遗留任务、极简单的批处理、对执行时间无要求的场景。 Hive SQL批处理的首选通用引擎,尤其适合复杂的ETL和多阶段查询任务。 追求极致性能、机器学习预处理、迭代计算、流批一体的场景。
资源消耗 - 资源利用率比MR有显著提升 内存消耗大,需要更精细的内存资源配置和调优。
调试难度 相对简单直观。 DAG结构复杂,调试较难 相对复杂,但拥有更丰富的生态工具支持。
默认状态 Hive早期版本的默认引擎 目前许多Hive版本(如MRS 3.1.2-LTS及之后)的默认引擎 需手动切换。

💡 如何选择?

  1. 慎用 MapReduce :除非是历史原因或极其简单的任务,否则在生产环境中强烈不推荐使用,它是性能瓶颈的主要来源。

  2. 首选 Tez :如果你的工作负载主要是Hive SQL批处理(如ETL)和即席查询(Ad-hoc),希望在几乎不改动代码的情况下显著提升性能,并希望保持与Hive生态的紧密集成,Tez是直接、有效的升级选择

  3. 选择 Spark :如果你追求极致的批处理性能 ,工作负载包含迭代计算(机器学习、图算法),或需要利用Spark强大的生态系统(如MLlib)进行流批一体处理,并且集群有充足的内存资源,那么Spark会是更合适的选择。

值得注意的是,有最新的基准测试(TPC-DS 10TB)显示,在顺序执行总耗时和平均响应时间方面,Hive on Tez甚至优于Apache Spark


但在高并发场景下,Spark展现出更高的效率。这说明性能优劣会因具体场景和版本而异,实践是检验真理的唯一标准。

可以通过 set hive.execution.engine=mr;(或 tezspark)命令在会话级别动态切换引擎。


Hive on Spark


Hive on Spark 指的是将 Hive 的执行引擎从默认的 MapReduce 替换为 Apache Spark

简单来说,就是:

  • Hive 负责解析 SQL(词法、语法分析、生成逻辑计划)。

  • Spark 负责执行(将逻辑计划转为 Spark 的 RDD/DAG 作业,在集群中计算)。

这样做的好处是利用 Spark 的内存计算和 DAG 调度能力,让 Hive 的 SQL 查询速度比原生的 MapReduce 引擎快数倍甚至数十倍,同时用户依然可以继续写 Hive SQL,无需改动代码。你只需要设置一条命令即可启用:

sql

sql 复制代码
set hive.execution.engine=spark;

Hive on Tez


Hive on Tez 指的是将 Hive 的执行引擎替换为 Apache Tez

可以把它理解为和"Hive on Spark"并列的另一种加速方案。它们的区别在于:

  • 核心原理 :Tez 同样会把 Hive SQL 转换成**DAG(有向无环图)**来执行,从而避免 MapReduce 那种"每个阶段都要写磁盘"的低效模式。它通过减少磁盘IO和重用容器(JVM)来大幅提速。

  • 适用定位 :如果说 Spark 是个"全能选手"(能做批处理、流计算、机器学习),那 Tez 就是个专为 Hive/ Pig 等批处理优化的"专业选手"。它在 Hive 的复杂 ETL 和多表 Join 场景下表现非常优秀,且资源消耗通常比 Spark 更"克制"。

  • 启动方式:同样只需一条命令即可切换:

    sql

    sql 复制代码
    set hive.execution.engine=tez;

一句话总结两者的选择 :如果你的集群内存资源比较紧张,或者主要就跑 Hive 的 ETL 任务,选 Tez 性价比很高;如果追求极致性能且有充足内存,或者还需要跑机器学习,选 Spark


Hive 内部表和外部表的性能有区别吗


性能上基本没有区别。

无论是内部表还是外部表,在底层都是将数据以文件形式(如ORC、Parquet)存储在HDFS上,执行查询时完全走相同的计算引擎(MR/Tez/Spark),扫描和计算数据的路径一致,因此查询性能没有差异。

它们的核心区别仅在于元数据管理

  • 内部表 :由Hive完全管理,删除表时会连带删除HDFS上的数据。

  • 外部表 :由Hive管理元数据(表结构),但数据在外部(如HDFS上其他路径),删除表时只删元数据,不删数据

选择建议 :如果数据是共用的(如被多个组件访问),用外部表 更安全;如果数据仅由Hive独占且生命周期与表一致,用内部表即可。


表统计信息


表统计信息 是数据库优化器用来生成最佳执行计划元数据,描述了表和数据列的"物理特征",是CBO(基于成本的优化器)的决策依据。


主要统计项:

  • 表级:数据行数、数据块数、平均行长度

  • 列级:不同值数量(NDV)、NULL值比例、数据分布直方图

  • 索引级:索引高度、叶子块数、聚簇因子


如何维护:

  • Oracle:DBMS_STATS.GATHER_TABLE_STATS

  • MySQL:ANALYZE TABLE

核心原则 :统计信息要定期收集,否则过时的统计信息会导致优化器做出错误判断(如本该用索引却走了全表扫描),直接影响查询性能。👍


统计信息要定期收集,具体怎么做,示例


具体做法取决于你用的数据库,但核心思路都一样:利用数据库自带的命令手动触发,或者依赖其自动机制。


🖥️ Oracle 数据库:使用 DBMS_STATS

在 Oracle 中,通过 DBMS_STATS 包来手动收集统计信息是最标准的方式。示例语句如下:

sql

sql 复制代码
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS( 
        OWNNAME     => 'SCHEMA_NAME',        -- 替换为实际的用户名
        TABNAME     => 'TABLE_NAME',         -- 替换为实际的表名
        GRANULARITY => 'ALL',                -- 收集所有粒度:全局、分区、子分区
        CASCADE     => TRUE,                 -- 同时收集索引统计信息
        METHOD_OPT  => 'FOR ALL COLUMNS SIZE AUTO', -- 让Oracle自动决定是否为列创建直方图
        DEGREE      => 32                    -- 并行度,根据服务器性能调整
    );
END;
/
  • OWNNAMETABNAME 指定要操作的表。

  • GRANULARITY => 'ALL' 在分区表场景下很关键,确保所有层级的统计信息都被更新。

  • CASCADE => TRUE 会一并更新该表所有索引的统计信息,是常规操作。

  • METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO' 是比较推荐的设置,Oracle会自动判断哪些列数据分布不均,并为它们创建直方图来帮助优化器做出更准确的判断。

Oracle 的自动方案

在默认配置下,Oracle 会通过自动优化器统计信息收集 功能,在夜间维护窗口自动为统计信息缺失或过时的对象收集统计信息。Oracle 19c 及更高版本还引入了高频自动收集,针对变化频繁的表,默认每15分钟就会进行一次轻量级的统计信息更新。

🐬 MySQL 数据库:使用 ANALYZE TABLE

在 MySQL 中,手动收集统计信息的命令是 ANALYZE TABLE

sql

sql 复制代码
ANALYZE TABLE your_database.your_table;

这条命令会重新计算表的行数估算值和索引的基数(Cardinality,即索引值的区分度),并将其更新到数据字典中。

MySQL 的自动方案

MySQL 依靠两个关键参数进行自动化管理:

  1. innodb_stats_persistent:默认开启 (ON),将统计信息持久化到磁盘,避免重启后丢失,提升计划稳定性。

  2. innodb_stats_auto_recalc:默认也开启 (ON)。当表中超过 10% 的数据发生变动时,会在后台异步 触发统计信息重新计算。这意味着,如果业务需要变更后立即获得最新统计信息(例如,大批量导数据后),仍然建议手动执行 ANALYZE TABLE 来确保前台同步更新。


Oracle 数据生命周期 成熟的 TTL 和归档策略


🔑 什么是 TTL?

TTL(Time To Live,生存时间) 是数据生命周期管理(ILM)的核心策略 ,它明确定义了数据从创建到"失效"或"可被清理"的存活时长

简单说,就是给数据设定一个"保质期"。比如,规定"订单数据只保持在线 90 天 ",那么 90 天 就是这条规则的 TTL


在 Oracle 中,TTL(Time To Live,生存时间)归档策略 是数据生命周期管理(ILM,Information Lifecycle Management)的核心,核心目标是在存储成本查询性能之间找到平衡。


简单来说,就是让"热"数据快、"冷"数据省、"过期"数据删。


⏳ 数据生命周期各阶段策略

阶段 存储位置 核心操作 TTL/归档策略
1. 热数据 (在线、高频) 高性能存储(SSD) 频繁 DML,实时查询 TTL 定义 :明确数据"保鲜期"(如 created_date + 3个月),期间为热点数据。
2. 温数据 (在线、低频) 标准存储(SAS) 历史查询,生成报表 分区裁剪 :基于日期分区(RANGE 分区),查询时只扫描需要分区,提升效率。
3. 冷数据 (近线、极少访问) 低成本存储(如归档表空间) 极少访问,仅供审计 分区交换/移动 :使用 ALTER TABLE ... EXCHANGE PARTITION 将冷分区切换到只读归档表。
4. 过期数据 (符合删除条件) 物理删除,释放空间 DROP / TRUNCATE 分区 :安全删除整个过期分区(DDL操作),避免大量 DELETE 产生的高成本与日志开销。

🔧 成熟方案的关键技术

  • 分区表 (Partitioning) :这是所有 TTL 和归档策略的基础 。通过日期范围分区(RANGE PARTITION),数据被物理隔离,使"删除整个分区"和"移动整个分区"成为轻量级的元数据操作。

  • 间隔分区 (Interval Partitioning) :Oracle 11g+ 的特性,可以自动创建新分区。比如设定每月一个分区,新增数据会自动按日期落入对应分区,无需手动维护,大幅降低 DBA 运维负担。

  • 分区交换 (Partition Exchange) :将整个分区与一张结构相同的普通表进行秒级交换 ,常配合压缩(如 OLTP 压缩、高级压缩)来压缩冷数据,空间节省可达 70%-90%。

  • 自动数据优化 (ADO) :Oracle 12c+ 的企业版功能,允许你定义策略让数据库自动执行。例如,"将 30 天前的分区自动移动到归档表空间,并将 90 天前的分区压缩"。

🆚 与 MySQL 对比的一点补充

  • 分区成熟度:Oracle 的分区功能极其强大(如外键分区、复合分区等),而 MySQL 的分区功能相对基础。对于大规模数据,Oracle 方案更成熟。

  • 删除操作建议 :基于 TTL 删除历史数据时,强烈建议使用 DROP PARTITION ,而不是 DELETE 语句。DELETE 会产生大量 Undo/Redo 日志,性能极差且可能引发事务表空间不足,是生产环境的禁忌操作。DROP PARTITION 则是高效的元数据操作。


Oracle 表类型 标准表、临时表、外部表


📊 Oracle 三种核心表类型对比

表类型 存储位置 生命周期 核心用途 关键特性
标准表 (普通堆表) 永久表空间 永久,直到显式删除 存储永久性业务数据,是所有应用的核心数据载体。 * 堆组织表(默认) :数据无序存放(HEAP)。 * 索引组织表(IOT):数据按主键排序存储,适合主键精确查询和范围扫描。
临时表 (Temporary Table) 临时表空间 (TEMP) 会话或事务级,数据自动清除 存储中间计算结果,如复杂查询的临时集合、报表处理的中间表。 * 数据只对当前会话可见 ,会话结束后数据自动清空。 * 不产生 Redo 日志,写入快,适合高并发中间处理。
外部表 (External Table) 数据库外部(OS 文件,如 CSV、TXT) 数据仅在查询时读取,不存储在数据库中 外部文件映射为表,用于数据加载(如 ETL 抽取)、直接查询日志文件。 * 只读 (默认),不支持 DML 操作。 * 通过 访问驱动程序(如 ORACLE_LOADER, ORACLE_DATAPUMP)读取文件。

🧩 与 MySQL 的一点对比

  • 临时表 :Oracle 的临时表结构永久存在,数据自动清空 ;MySQL 的临时表(CREATE TEMPORARY TABLE)则表结构和数据都在会话结束后自动销毁,两种设计哲学不同。

  • 外部表 :MySQL 没有完全对应的内置功能,通常通过 LOAD DATA INFILE 导入文件到普通表,或使用 Federated 引擎 访问远程表,但功能较弱。Oracle 的外部表则像一个标准的 ETL 工具,可以直接在 SQL 中查询文件。

🏦 银行场景举例

  • 标准表 :存储交易流水客户主数据,使用复合分区(如按日期 + 按机构)管理海量数据,是数据仓库的基础。

  • 临时表 :在跑批(Batch)中用于存储复杂报表的中间结果,例如先汇总到一个临时表,再与外部表(如下发的监管格式文件)进行 JOIN 处理,提升性能且不污染业务表。

  • 外部表 :在 ETL 中直接查询由上游系统生成的 CSV 文件(如监管报送格式文件),省去导入步骤,实现快速加载和验证。此外,还可以通过配置访问驱动程序来解析 JSON/XML 等非结构化日志文件。

💡 重点理解与场景举例

  • 临时表的设计哲学

    • 与 MySQL 不同 :Oracle 的临时表是结构永久存在,数据自动清空 ;而 MySQL 的临时表是表结构和数据都在会话结束时自动销毁

    • 核心优势:临时表不产生 Redo 日志,在大规模数据加工场景中能显著减少 I/O 开销,提升性能。

    • 银行场景 :在跑批中用于存储复杂报表的中间结果,例如先汇总到一个临时表,再与外部表(如下发的监管格式文件)进行 JOIN 处理。

  • 外部表的核心价值

    • 它不是一个 ETL 工具,而是一个 ETL 的加速器。它允许你在 SQL 中直接查询文件,省去了"先导入再查询"的步骤。

    • 银行场景 :在 ETL 中直接查询上游系统生成的 CSV 文件(如监管报送格式文件),实现快速加载和验证。此外,还可以通过配置访问驱动程序来解析 JSON/XML 等非结构化日志文件。这个功能在 MySQL 中没有完全对应的内置方案。

  • 标准表的分区设计

    • 在银行等大型系统中,标准表常使用复合分区(如按日期 + 按机构)来管理海量数据。这是构建数据仓库的基你好,我注意到你的提问中提到了Oracle的几种表类型,但描述"标准表、临时表、外部表"的类别划分其实不够完整。为了帮你更系统地建立知识框架,我来做一次全面的梳理和扩展。

📊 Oracle 主要表类型(扩展版)

表类型 存储位置 生命周期 核心用途 关键特性
标准表 (普通堆表) 永久表空间 永久,直到显式删除 存储永久性业务数据,是所有应用的核心数据载体。 * 堆组织表(默认) :数据无序存放(HEAP)。 * 索引组织表(IOT):数据按主键排序存储,适合主键精确查询和范围扫描。
分区表 永久表空间(可分布在不同表空间) 永久,但分区可独立管理 将大表物理分割为更小的独立段(Segment),提升海量数据的管理和查询性能。 * 核心优势 :分区裁剪(Partition Pruning)、分区交换(Exchange)、独立备份与恢复。 * 常用分区方式:范围分区(RANGE)、列表分区(LIST)、哈希分区(HASH)。
临时表 (Temporary Table) 临时表空间 (TEMP) 会话或事务级,数据自动清除 存储中间计算结果,如复杂查询的临时集合、报表处理的中间表。 * 数据只对当前会话可见 ,会话结束后数据自动清空。 * 不产生 Redo 日志,写入快,适合高并发中间处理。
外部表 (External Table) 数据库外部(OS 文件,如 CSV、TXT) 数据仅在查询时读取,不存储在数据库中 外部文件映射为表,用于数据加载(如 ETL 抽取)、直接查询日志文件。 * 只读 (默认),不支持 DML 操作。 * 通过 访问驱动程序(如 ORACLE_LOADER, ORACLE_DATAPUMP)读取文件。
  • 分区表 :这是你之前问的数据生命周期 策略的底层基础 ,必须结合理解。没有分区表,TTL 和归档策略几乎无法高效实现。建议你将"分区表"和"标准表"看作两个维度:标准表是逻辑存在,分区表是物理实现方式 。可以将这部分内容看作是对之前"数据生命周期"回答的补充。好的,我们来聚焦你提到的这几种 Oracle 表类型。你列的"标准表、临时表、外部表"这个分类更多是基于使用场景 的划分,而在 Oracle 中更核心的区分是数据存储位置生命周期管理

💡 关键补充与场景举例

  • 分区表:不是一个新的分类,而是标准表的物理实现方式。分区表本质上是标准表的一种,但它通过物理分割来管理超大表,是 TTL 策略落地的基础。

  • 外部表:不是一个 ETL 工具,而是一个 ETL 的加速器。它允许你在 SQL 中直接查询文件,省去了"先导入再查询"的步骤。在银行场景中,常用于直接查询上游系统生成的 CSV 格式监管报送文件。

  • 临时表的设计哲学 :Oracle 的临时表是结构永久存在,数据自动清空 ;这与 MySQL 的临时表(表结构+数据均在会话结束销毁)不同。其核心优势是不产生 Redo 日志,适合高并发的中间结果存储。在银行跑批中,常用于存储复杂报表的中间聚合结果,然后再与外部表进行 JOIN。

这四种表类型,共同构成了 Oracle 中"数据存储与处理"的基础分类。标准表和分区表负责持久化存储 ,临时表负责过程加速 ,外部表负责数据桥接


Oracle 列字段约束 NOT NULL, PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK


数据库约束(Constraints)是作用于表列上的规则,用于保证数据的完整性和准确性。


结合你之前的背景,可以把它们理解为数据入库前的**"安检规则"**。


下面是 Oracle(及其他关系型数据库)中这 5 种核心约束的对比总结:

📊 Oracle 列字段约束对比

约束类型 核心作用 关键特性 典型使用场景
NOT NULL 确保列不能为空 列级约束,无名称也可定义。 必须有的字段,如 ID姓名金额
UNIQUE 确保列值全局唯一,可为空 自动创建索引;一个表可有多个。 身份证号、手机号、邮箱等业务唯一标识。
PRIMARY KEY (主键)唯一标识表中的每一行 = NOT NULL + UNIQUE,每个表只能有1个,自动创建索引。 表的业务主键或逻辑主键。
FOREIGN KEY (外键约束)定义表间的父子关系,引用另一表的主键/唯一键 可级联更新/删除(ON DELETE CASCADE)。 订单表的 customer_id 关联客户表的 id
CHECK 定义列值必须满足的条件表达式 可定义复杂业务规则(如金额>0,日期范围)。 金额必须大于0;状态只能是 'Y' 或 'N';日期不能晚于今天。

主键默认就是索引 ,而且是一种特殊的索引------聚簇索引(Clustered Index)。


性能优化:回表(触发条件)、聚簇索引、二级索引、覆盖索引(状态),驱动表,MD5 摘要字段


💡 一些补充要点

  • 约束命名 :建议在创建表时显式命名 约束(如 CONSTRAINT pk_emp_id PRIMARY KEY (id)),这样在后续维护(如禁用、启用、删除)时会更清晰方便。

  • 外键与索引 :虽然外键不自动创建索引,但最佳实践通常会在外键列上手动创建索引 ,以避免在主表删除数据时引发锁等待问题,提升关联查询性能。

  • CHECK约束的灵活性CHECK 约束不仅限于单列,也可以定义基于多列的行级条件,比如 CHECK (end_date >= start_date)

🆚 一点延伸:与 MySQL 的差异

如果你从 Oracle 转到 MySQL,有两点细微差别值得留意:

  • 默认值 :MySQL 的 NOT NULL 列如果插入 NULL,在严格模式下会报错;在非严格模式下会用隐式默认值填充,这可能会导致数据不一致,建议统一开启严格模式。

  • 外键 :MySQL 的 FOREIGN KEY 约束仅在 InnoDB 存储引擎下生效,MyISAM 会解析语法但不实际执行。你们现在基于 Oracle 的经验是通用的,但若接触 MySQL,记得确认引擎为 InnoDB。


MySQL 列字段约束 NOT NULL, PRIMARY KEY (必须), UNIQUE, DEFAULT, COMMENT


在 MySQL 中,列字段约束和属性是保障数据准确性的重要手段。


结合你之前对 Oracle 的了解,这里把 MySQL 中这几个常用约束和属性梳理一下,并标出关键差异。

📊 MySQL 列字段约束与属性对比

约束/属性 核心作用 关键特性 与 Oracle 的主要差异
NOT NULL 确保列不能为空 列级约束,数据完整性的基本要求。 行为基本一致。但在 MySQL 非严格模式下,插入 NULL 可能被转为隐式默认值,建议开启严格模式以保证数据一致性。
PRIMARY KEY 唯一标识表中的每一行 必须 定义,且只能有 1 个。等同于 NOT NULL + UNIQUE,自动创建聚簇索引。 Oracle 不强制要求 定义主键;而 MySQL 的 InnoDB 引擎必须显式定义 主键,否则会隐式创建一个不可见的 ROW_ID,这可能带来性能风险。
UNIQUE 确保列值全局唯一 可多个;自动创建唯一索引;允许 NULL 值(且多个 NULL 不算重复)。 行为基本一致。
DEFAULT 为列设置默认值 INSERT 未指定该列时,使用此默认值。 行为基本一致。但在 MySQL 中,如果 DEFAULT 值与 NOT NULL 同时使用,需确保默认值有效。
COMMENT 为列或表添加注释 一种元数据,用于说明字段含义,不强制数据规则。 Oracle 中的注释 通过 COMMENT ON COLUMN ... 语句添加。MySQL 则直接在 CREATE TABLE 的列定义中使用 COMMENT 关键字,在可移植性上略有差异。

💡 关键点详解:为什么 PRIMARY KEY 在 MySQL 中是"必须"的?

你特别标注了 PRIMARY KEY (必须),这一点非常关键,也正好是与 Oracle 的一个重要区别。

  • InnoDB 引擎的特性 :MySQL 默认的 InnoDB 引擎是索引组织表,数据按主键顺序存储。如果没有定义主键:

    1. InnoDB 会寻找第一个非空且唯一的列作为隐式主键。

    2. 如果找不到,它会自动生成一个名为 GEN_CLUST_INDEX6字节隐藏主键

  • 为什么要避免使用隐式主键 :这个隐藏主键对业务不可见,无法用于查询优化。更重要的是,它的值是无序的,可能导致数据页频繁分裂 ,降低写入性能。因此,为每张表显式定义一个与业务无关的自增数字列作为主键(即"代理主键")是 MySQL 的最佳实践

📝 一个建表语句示例

sql

sql 复制代码
CREATE TABLE orders (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID(主键)',
    order_no VARCHAR(32) NOT NULL COMMENT '订单编号',
    customer_id INT NOT NULL COMMENT '客户ID',
    amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额',
    status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1-待支付,2-已支付',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_order_no (order_no)
) COMMENT='订单表';

💡 两个关键建议

  1. 显式定义主键:为所有 InnoDB 表显式定义一个自增数字主键,避免使用业务字段作为主键,除非该字段具有绝对稳定且唯一的特性。

  2. 善用 COMMENT :在开发规范中,强制要求为所有表和字段添加 COMMENT。这在团队协作和数据字典维护中非常有用,能显著提升数据库的可读性和可维护性。好的,我们来聚焦 MySQL 的这几个列字段约束和属性,结合你已有的 Oracle 知识,把它们的差异和要点理清楚。

📊 MySQL 列字段约束与属性对比

约束/属性 核心作用 关键特性 与 Oracle 的主要差异
NOT NULL 确保列不能为空 列级约束,数据完整性的基本要求。 行为基本一致。但在 MySQL 非严格模式下,插入 NULL 可能被转为隐式默认值,建议开启严格模式以保证数据一致性。
PRIMARY KEY 唯一标识表中的每一行 必须 定义,且只能有 1 个。等同于 NOT NULL + UNIQUE,自动创建聚簇索引。 Oracle 不强制要求 定义主键;而 MySQL 的 InnoDB 引擎必须显式定义 主键,否则会隐式创建一个不可见的 ROW_ID,这可能带来性能风险。
UNIQUE 确保列值全局唯一 可多个;自动创建唯一索引;允许 NULL 值(且多个 NULL 不算重复)。 行为基本一致。
DEFAULT 为列设置默认值 INSERT 未指定该列时,使用此默认值。 行为基本一致。但在 MySQL 中,如果 DEFAULT 值与 NOT NULL 同时使用,需确保默认值有效。
COMMENT 为列或表添加注释 一种元数据,用于说明字段含义,不强制数据规则。 Oracle 中的注释 通过 COMMENT ON COLUMN ... 语句添加。MySQL 则直接在 CREATE TABLE 的列定义中使用 COMMENT 关键字,在可移植性上略有差异。

GBase或GoldenDB的关系和区别


简单来说:GBase更像一个产品家族,而GoldenDB是一款专注金融核心的分布式数据库产品。它们的主要关系和区别如下:

📌 核心关系与定位

  • GBase (南大通用) :一个产品系列,拥有8s、8a、8c等多款不同架构的数据库,分别应对事务(OLTP)、分析(OLAP)、分布式等不同场景,像一个数据库"超市"。

  • GoldenDB (金篆信科,中兴通讯控股) :一款专注于金融级分布式事务的单一产品,像银行核心交易系统的"特供装备",在国有大行核心系统有深度实践。

🆚 关键区别对比

维度 GBase (以8a/8s/8c为例) GoldenDB
擅长领域 8a 主攻分析(AP),8s 主攻集中式交易(TP),8c主攻分布式交易(TP),是个"多面手"。 专注分布式事务(OLTP),并强调HTAP混合负载能力,性能经国有大行核心系统验证。
技术架构 8a 是MPP列存集群;8s 是集中式行存;8c是分布式多模架构。 分布式架构,深度优化MySQL内核(InnoDB),通过全局事务管理器(GTM)确保强一致性。
应用场景 8a 用于大数据分析、BI;8s 用于政企、电信等核心交易;8c用于需要弹性扩展的分布式场景。 银行账务核心、信用卡核心、支付清算、运营商计费等对一致性要求极高的场景。
生态与兼容 8s侧重兼容Oracle,8c兼容MySQL/PG,各有侧重。 深度兼容MySQL语法和协议,迁移成本相对较低。

GIS地图可视化


GIS地图可视化,简单来说,就是将带有地理位置信息的数据,通过地图这种直观的形式展示出来。


它的核心在于把空间数据转化为易于理解的视觉语言。


根据你的背景,它可以被看作是一个专门处理"空间数据"的数据可视化分支,其技术栈和典型应用场景如下。

💡 核心技术与实现方式

实现GIS地图可视化,通常需要一套从数据到展示的完整技术链,大致可分为三类:

  • 专业GIS平台:这是最强大的工具,提供从数据管理、2D/3D制图到复杂空间分析的全套能力。

    • 主要工具:ArcGIS Pro,这是行业标准之一。你可以在里面创建2D地图和3D场景(在ArcGIS中称为Scene),通过叠加不同的业务和地形图层,从多维度理解空间关系。

    • 核心技术图层(Layer)。数据以图层形式叠加,每个图层代表一个主题(如道路、建筑),可以独立控制显示样式和分析。

  • 云服务与平台:这类方案能帮你快速搭建应用,无需从零开始构建底层技术。

    • 主要工具:例如阿里云的DataV-Atlas,它结合云数据库,提供了一站式的时空数据可视化与分析方案。

    • 核心技术 :常与SQL深度结合。你可以通过编写SQL查询语句,对地理数据进行筛选、聚合(如生成热力图、蜂窝图),并直接呈现在地图上。

  • 地图SDK与服务:这类方案是为开发者设计的,用于将地图功能集成到自己的业务应用中。

    • 主要工具:例如百度地图的智慧金融地图方案。它整合了离线地图、定位、轨迹管理、地址解析等一系列功能。

    • 核心技术 :提供的是位置服务能力,比如你可以用它的API来展示客户分布、规划客户经理拜访路线、分析网点辐射范围等。

🏦 金融行业(尤其是银行)的应用场景

和你之前关注的方向高度相关,GIS可视化在银行的应用已经很成熟,从你之前关注的银行业技术选型来看,它主要用在以下场景:

  • 网格化营销与精细化管理 :这是最典型的应用。通过GIS自动划分管户区域,银行可以实现客户经理的精准派单和营销轨迹追踪。例如,xx银行就利用GIS技术,自动划分客户经理的管户区域,提升走访效率。

  • 网点选址与潜力评估:通过叠加人口、商圈、竞争对手等数据图层进行空间分析,辅助科学决策。

  • 风险控制与运营:例如地址标准化核验、基于地理位置的欺诈风险识别、业务数据的区划分析等。

🌆 杭州本地:GIS赋能城市治理

在杭州的就业环境中,GIS不只是商业工具,更是智慧城市建设的核心基础设施。杭州市政府正大力推动实景三维和地理信息时空底座的建设:

  • 智慧城市底座 :杭州已建成全市统一的地理信息时空底座,整合了覆盖全市3040平方公里的倾斜摄影数据,为超过60个部门的106个应用场景提供地图服务。

  • 具体应用 :这个"数字孪生杭州"的底座,被广泛应用于地下隐患智防城市风貌管控 (如西湖、大运河周边)、建设项目全生命周期管理等场景。

对于求职者来说,这意味着掌握GIS相关技术,不仅在专业的GIS厂商或银行科技部有市场,在服务政府数字化的相关企业(如杭州市勘测设计研究院)也有非常明确的需求。


搭建从MySQL到目标库的增量同步管道(利用MySQL binlog),MySQL binlog是什么


MySQL binlog (Binary Log,二进制日志)是 MySQL 数据库的变更日志 ,它按顺序记录了所有数据定义(DDL) 和**数据操作(DML)**语句(如 INSERT、UPDATE、DELETE)的详细变更信息。

它在增量同步中的核心作用

  • 变更捕获源 :增量同步工具(如 CanalFlink CDC )正是通过模拟自身为 MySQL 的从库(Slave) 来实时、顺序地读取和解析 binlog,从而捕获每一条数据变更,实现数据的增量同步。

  • 记录变更内容binlog 中,对于每一条 UPDATE 语句,会记录 修改前(Before)修改后(After) 的完整行数据,这为同步提供了精确的数据源。

  • 断点续传基础binlog位点(Position) 和**时间戳(Timestamp)**概念,同步工具可以记录已消费的位点,在网络故障或重启后从断点处继续同步,保证数据不丢不重。

⚙️ 使用须知

  • 必须开启binlog 默认是关闭的,搭建增量管道前,必须在 MySQL 配置文件(my.cnfmy.ini)中开启,并设置 binlog_format=ROW(行级记录模式),以保证数据完整性。

  • 注意磁盘空间binlog 会持续增长,需设置合理的过期时间(expire_logs_days)或定期清理,防止磁盘写满。

  • 性能影响 :开启 binlog 会增加约 10% 的写入性能开销,但对于数据一致性要求高的核心系统,通常是可接受的必要代价。


MPP数据库


结合你对大数据开发工具链的关注,来理解MPP数据库会非常顺畅。你可以把它看作是为大规模数据分析(OLAP) 而生的"专业选手",和我们熟悉的MySQL、Oracle这类"全能选手"走的完全是两条路。

📊 MPP数据库是什么?

MPP(Massively Parallel Processing,大规模并行处理)数据库,核心就是**"众人拾柴火焰高"** 。它采用Shared Nothing(无共享) 架构,将数据打散存储在多个独立的服务器节点上。当查询来时,所有节点并行处理自己手上的数据,最后汇总结果。

🔍 核心优势与典型场景

  • 核心优势高性能、高扩展性。通过增加节点就能线性提升计算能力,特别适合处理PB级的海量数据。它通常采用列式存储和高压缩比技术,在分析场景下比传统数据库快几个数量级。

  • 典型场景 :MPP数据库主要用于数据仓库、BI报表分析、实时数仓和复杂决策支持系统。在银行、大型国企的数据平台中是核心组件。

🆚 与熟悉工具的对比

把它和你了解的工具对比,位置会更清晰:

对比维度 MPP数据库 (如StarRocks, ClickHouse) 传统关系型数据库 (如Oracle/MySQL) Hadoop生态 (如Hive/Spark)
核心定位 海量数据快速分析查询 日常事务处理 (增删改查) 大规模数据批处理和ETL
架构特点 Shared Nothing,并行计算 ,常为列式存储 集中式或主从架构,行式存储 分布式存储+计算,但常需读写磁盘
擅长场景 复杂关联查询、实时汇总、BI报表 高并发、低延迟的单点数据操作 海量数据的清洗、转换、批处理
性能特点 亚秒级查询响应(针对分析查询) 毫秒级事务响应 分钟级甚至小时级(批处理)
数据新鲜度 支持实时或准实时数据写入 实时 通常是T+1批处理

🏦 为什么银行偏爱它?

你之前关注过银行的技术选型,MPP数据库正是其数据平台的关键一环。

  • 国产化替代 :以GBase 8aStarRocks等为代表的国产MPP数据库,已在国内银行核心分析系统中大规模落地,是信创替代的重要方向。

  • 场景全覆盖 :银行的风险控制、精准营销、监管报送、经营决策等,都依赖MPP数据库对海量数据的秒级分析能力。

  • 实战验证:如浙江农商联合银行在2023年新一代大数据平台招标中,就明确采购了MPP数据库软件,并在2024年进一步采购了针对MPP数据库的SQL审核与管控服务,可见其在核心系统中的关键地位。

💡 主流MPP数据库一览

  • 开源/通用选择Greenplum (基于PostgreSQL的老牌代表)、ClickHouse (查询性能极快)、StarRocks / Apache Doris (实时分析能力强,兼容MySQL协议)。

  • 国产商业代表GBase 8a (南大通用,在金融行业有超45000节点部署案例,单集群可管理10PB以上数据)。

  • 云上托管服务Amazon Redshift, Snowflake, Google BigQuery


DECIMAL(精度可控) 是指可以精确指定数字的总位数和小数位数,避免浮点数(如 FLOAT/DOUBLE)的精度丢失问题。


语法DECIMAL(M, D)

  • M(精度) :数字的总位数(最大65)

  • D(小数位数):小数点后的位数

示例DECIMAL(10, 2) → 总长10位,小数2位,范围 -99999999.99 ~ 99999999.99


核心价值

  • 精确计算 :金额、库存等场景必须用 DECIMAL,避免 0.1 + 0.2 = 0.30000000000000004 这类误差

  • 空间可控:M 和 D 决定存储字节数,可预估空间开销

一句话 :DECIMAL = 用空间换精度,适合钱和精确数值。👍


I/O扫描指数据库从磁盘读取数据页到内存的过程。


关键点:

  • I/O = 磁盘输入/输出(数据读写)

  • 扫描 = 遍历数据页查找目标数据

  • 代价高 :磁盘I/O速度远慢于内存操作,是查询性能的主要瓶颈


常见扫描类型:

  • 全表扫描:读取所有数据页(适合小表或大批量查询)

  • 索引扫描:只读取索引页,再回表取数据(适合点查或小范围查询)

优化目标:减少I/O扫描次数(如用索引、覆盖索引、列存储等)。👍


事务


事务 是一组数据库操作的逻辑执行单元 ,要么全部成功 ,要么全部失败(回滚),不存在中间状态。


核心特性(ACID):

  • 原子性:操作不可分割,全做或全不做

  • 一致性:事务前后数据保持合法状态

  • 隔离性:并发事务互不干扰

  • 持久性:提交后数据永久保存


经典例子:转账(A扣钱 + B加钱)必须在一个事务中完成,不能出现A扣了但B没收到的情况。👍


ACID 是数据库事务的四个核心特性,确保数据在并发操作和系统故障下依然可靠。


简短解释如下:

  • A (Atomicity) 原子性:事务是一个不可分割的整体。要么全部执行成功,要么全部失败回滚,没有"执行一半"的状态。比如转账,扣钱和到账必须同时成功。

  • C (Consistency) 一致性:事务执行前后,数据库从一个合法状态变到另一个合法状态。所有约束(如外键、唯一性)都必须满足。

  • I (Isolation) 隔离性:多个事务并发执行时,彼此隔离,互不干扰。一个未提交的事务的中间状态,对其他事务不可见。

  • D (Durability) 持久性:事务一旦提交,对数据的修改就永久生效,即使系统断电或崩溃也不会丢失。


面试时一句话总结

"ACID 是保证数据库事务可靠的四个特性:原子性 保证全做或全不做,一致性 保证数据始终合法,隔离性 保证并发不互相干扰,持久性保证提交后不丢失。"


防追问:Hive 支持 ACID 吗?

"Hive 从 3.0 开始支持 ACID,但需要配置事务管理器和分桶表。


早期版本主要做批量分析,对 ACID 支持很弱,这也是 Hive 和传统关系型数据库的重要区别之一。"

结构化,非结构化,半结构化 数据


这个问题是数据分析面试的"开场必问",考的是你对数据形态的基本认知。


面试标准回答

数据按结构化程度可以分为三类:

  • 结构化数据:有固定的行和列,每列类型明确,可以用 SQL 直接查询。比如银行的核心交易表、客户信息表。

  • 半结构化数据:有结构但不固定,有标签或层级,但不像二维表那样严格。比如日志文件(JSON/XML格式)、邮件信息,可以通过解析提取其中的字段。

  • 非结构化数据:没有预定义的数据模型,无法直接按行列存储和检索。比如监管报送中的图片、PDF文件、语音记录和文本文件。


防追问:你们平时主要处理哪一类?

"在数仓开发中,我们90%以上处理的是结构化数据,比如 ODS 层的业务表和 DWD 层的清洗表。

但也会遇到半结构化数据,比如:

  • Kafka 推送过来的 JSON 格式的日志 ,我们需要用 get_json_object()LATERAL VIEW JSON_TUPLE() 解析成结构化表。

  • 上游系统推送的 XML 文件,我们会在 ODS 层先通过 Python 或 Spark 解析成二维表,再进入 Hive 加工。

对于非结构化数据(如监管报送要求的附件图片、PDF),我们通常只存 HDFS 路径,由下游应用系统去读取。"


三类数据的对比(万一被追问,可以延伸讲)

类型 存储方式 常用工具 举例
结构化 关系型数据库 / Hive 表 SQL、Hive、Oracle、MySQL 客户表、交易表、风险等级表
半结构化 JSON/XML/日志文件 Hive 内置函数 (get_json_object)、Spark、Python 埋点日志、接口返回报文、Kafka消息
非结构化 对象存储 / HDFS 文件 存储路径 + 元数据管理 监管上报附件、客户证件照片、合同扫描件

面试时一句话总结

数仓最擅长处理结构化数据,但半结构化的日志和 JSON 也可以通过 Hive 自带的函数轻松解析,非结构化的文件则只存路径不存内容。


如果面试官追问:"你们银行遇到过半结构化数据吗?举个例子说说怎么处理的?" 需要我帮你准备吗?


BIBusiness Intelligence(商业智能) 的缩写。


简单说,就是把企业积累的海量数据,通过技术手段加工成直观的图表和报告,帮助管理层和业务人员看清现状、发现问题、做出决策


1. 一句话说清楚

"BI 就是用数据驱动决策------把杂乱的数据变成老板能看懂的报表和仪表盘,告诉管理层'昨天卖了多少'、'哪个产品最赚钱'、'下个月该往哪个方向发力'。"


2. BI 在数仓中的位置(面试重点)

BI 是数仓的"出口",位于数据流的最下游:

数据流层级 角色 工具/技术
数据源(业务系统) 产生原始数据 MySQL、Oracle、日志文件
↓ 采集
ODS → DWD → DWS → ADS 数据加工 Hive SQL、Spark
↓ 导出
BI 层(展示层) 数据可视化 FineReport、帆软、Tableau、Power BI
业务人员/管理层 看报表、做决策 Web 页面、移动端

简单来说:数仓负责"算",BI 负责"看"。


3. 银行里 BI 具体干什么

在农商行场景中,BI 主要体现在:

业务场景 数据来源(数仓) BI 怎么用
监管报送 EAST、1104 报表数据 通过 BI 工具生成报送报表,一键导出 Excel/PDF
经营分析 存款、贷款、中间业务收入 行长看板:今日存款余额、贷款发放量、不良率趋势图
客户画像 客户标签、持有产品、交易行为 客户经理看板:某客户持有哪些产品、最近一次交易时间
风险监控 风险等级、逾期贷款、大额交易 大屏展示:全行不良率、高风险客户数、逾期金额

4. 数仓和 BI 团队怎么配合?

数仓团队负责把数据加工成 ADS 层汇总表 (如 ads_loan_daily 每日贷款汇总),然后通过 SqoopDataX 导出到 MySQL/ClickHouse 等关系型数据库,BI 工具(如 FineReport)直接连这些表做可视化报表。
BI 工程师会基于我们提供的表设计图表、配置刷新频率,业务人员每天打开 Web 页面就能看到最新数据,不需要自己写 SQL。"


5. 面试时怎么答(完整版)

"BI 是 Business Intelligence,商业智能。它是数仓的出口,把数仓加工好的汇总数据通过图表、仪表盘、报表等形式展示给业务人员和管理层,帮助他们做决策。


在我们的项目中,数仓加工完 ADS 层报表数据后,会导出到 MySQL,用 FineReport 做可视化展示。


比如行长每天看的'全行经营日报'、监管报送的 1104 报表,都是通过 BI 工具实现的。"


6. 常用 BI 工具清单(提两个就行,显得你见多识广)

工具 类型 适用场景
FineReport(帆软) 国内主流 中国式复杂报表、监管报送(银行最爱)
Tableau 国外主流 数据分析、交互式可视化
Power BI 微软生态 微软生态企业、自助分析
Smartbi 国内 国产化替代方案

银行场景中,FineReport 和 Smartbi 最常见,因为符合国内报表习惯、支持信创。


一句话总结(背下来)

"BI 就是把数仓算好的数据,画成老板能看懂的图和表,用数据指导业务决策。"