读书笔记:外部表的两大“超能力”:直接读取压缩文件和自动清理脏数据
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
外部表的两大“超能力”:直接读取压缩文件和自动清理脏数据
超能力一:直接读取压缩文件,还能边读边过滤
一个头疼的场景:
你每周都会收到一个巨大的压缩数据包(比如 data.csv.gz)。按照老办法,你需要:
- 手动解压它。
- 然后才能把解压后的文件加载到数据库。
这就像每次收快递,都得先拆了包装才能把东西放进屋里,多了一步,很麻烦。
外部表的“一步到位”解决方案:
外部表可以让你直接查询压缩包内部,甚至在读取时还能对数据进行筛选。
它是怎么做到的?——靠一个“预处理脚本”
想象一下,你给外部表配了一个智能小助手(预处理脚本)。当你查询外部表时,会发生以下神奇的事情:
- 你:
SELECT * FROM 压缩数据表; - 数据库:呼叫智能小助手!
- 小助手:收到!自动找到压缩包 -> 解压 -> 顺便只提取第一列数据 -> 把整理好的结果交给数据库。
- 你:直接看到了最终结果。
真实操作步骤:
- 编写智能脚本:这个脚本用
find命令找到压缩文件,用zcat解压,并用cut命令只保留第一列数据。 - 创建外部表:在定义外部表时,通过
PREPROCESSOR指令把这个脚本“装配”上去。
CREATE TABLE 我的压缩数据表 (
第一列 VARCHAR2(20)
)
ORGANIZATION EXTERNAL (
...
PREPROCESSOR exec_dir:'我的智能脚本.sh' -- 关键!指定小助手
...
);
最终效果:
当你查询这张表时,看到的直接就是解压并过滤后的干净数据,完全感觉不到背后压缩包的存在。
这个技巧妙在哪?
你甚至可以让脚本去搜索整个目录下的所有压缩文件,然后把它们的内容合并、过滤后,作为一张表呈现给你。数据源从“一个文件”变成了“一组文件”或“一个动态搜索的结果”。
超能力二:自动给数据“洗澡”,告别脏字符
一个更头疼的场景:
业务人员从Windows电脑发来一个CSV文件,让你紧急导入生产库。你兴冲冲地建好外部表,却发现数据后面总跟着奇怪的 ^M 字符(Windows回车符),导致数据长度不对,查询和比对也各种出错。
传统笨办法:
先用一个文本工具手动清理文件,去掉这些脏字符,然后再加载。
外部表的“自动洗澡”方案:
同样,利用预处理脚本,在数据被读取前,自动给它“洗个澡”,洗干净再入库。
“自动洗澡”流程:
- 编写“洗澡”脚本:这个脚本使用
sed或dos2unix这样的命令,专门清除^M这类不必要的字符。 - 创建外部表:同样用
PREPROCESSOR指令挂载这个“洗澡”脚本。
CREATE TABLE 干净数据表 (
...
)
ORGANIZATION EXTERNAL (
...
PREPROCESSOR exec_dir:'我的洗澡脚本.sh' -- 数据进来先过一遍水
...
);
效果验证:
查询这张表,数据干干净净。你可以用 LENGTH(字段名) 函数来检查,确认数据长度正确,没有隐藏字符。
小贴士:脚本里的
^M字符很特殊,不能直接输入^和M,而是要在编辑器里按Ctrl+V,再按Ctrl+M打出来。
总结:预处理——外部表的“万能瑞士军刀”
通过这三个例子(查询系统状态、读取压缩文件、清理数据),我们看到 PREPROCESSOR 指令就像给外部表装上了一把“瑞士军刀”,让它变得无所不能:
- 数据源无限扩展:数据可以来自任何地方——一个系统命令的输出、一个压缩包、甚至是网络流。
- 数据处理前置:可以在数据进入数据库视线之前,完成解压、过滤、清洗、转换等所有准备工作。
- 流程极致简化:把原本需要多步、多人协作的复杂流程,压缩成了“一条SQL查询”的简单操作。
核心思想:将操作系统的强大命令能力与SQL的声明式查询能力无缝融合,让数据库能够直接消费和处理任何格式、任何位置的数据。
至此,我们已经领略了外部表在数据加载方面的强大威力。接下来,我们将探索本章的另一个主题:如何利用外部表或其它工具,高效地从数据库中卸载数据。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
浙公网安备 33010602011771号