Oracle外部表读取维基百科pageviews文件无数据返回问题求助
解决Oracle外部表读取维基百科Pageviews数据无返回的问题
我来帮你排查下这个问题,你遇到的外部表读不到数据的情况,大概率是建表配置没匹配文件格式,或者权限/路径有问题,咱们一步步来:
先确认文件的真实格式
虽然你猜测分隔符是空格,但先别急着下定论,先看看解压后的文件内容。比如在服务器上用命令取前几行看看:head -10 pageviews-20180407-130000维基百科2018年的Pageviews日志格式是
域名代码 页面标题 访问量 总响应大小,确实是空格分隔,但要注意页面标题里的空格是被替换成下划线的,不会出现字段内的空格干扰分隔。另外要确认有没有隐藏的换行符或者特殊字符,比如Windows格式的换行(\r\n),Oracle默认识别Unix的\n换行,这个也可能导致加载失败。补全并修正外部表的创建语句
你给出的建表语句不完整,Oracle外部表必须指定目录、访问参数这些关键配置。给你一个适配Pageviews格式的完整示例:-- 先创建并授权目录对象(必须先做这一步) CREATE OR REPLACE DIRECTORY pageviews_dir AS '/你存放解压后文件的绝对路径'; GRANT READ, WRITE ON DIRECTORY pageviews_dir TO 你的数据库用户名; -- 创建外部表 CREATE TABLE Funcionarios_Externa ( domain_code VARCHAR2(20), page_title VARCHAR2(4000), count_views NUMBER, total_response_size NUMBER ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY pageviews_dir ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ' ' MISSING FIELD VALUES ARE NULL REJECT ROWS WITH ALL NULL FIELDS -- 如果是Windows格式的换行,把上面的NEWLINE改成 '\r\n' ) LOCATION ('pageviews-20180407-130000') ) PARALLEL 5 REJECT LIMIT UNLIMITED;这里要注意:
- 目录路径必须是操作系统的绝对路径,而且Oracle进程要有这个路径的读写权限
- 如果你的文件里有部分行格式异常,
REJECT LIMIT UNLIMITED会让Oracle跳过错误行,不会因为个别坏行导致整个表读不到数据
查看加载错误日志
Oracle外部表加载失败时会生成日志文件,默认存放在你指定的目录下,文件名一般是Funcionarios_Externa.log。打开这个日志,里面会详细记录哪些行被拒绝、拒绝的原因(比如分隔符不匹配、字段长度不够、数据类型转换失败等),这是排查问题最直接的方式。用小文件测试
复制原文件的前10行到一个新的小文件(比如test_pageviews.txt),然后修改外部表的LOCATION指向这个小文件。如果小文件能读到数据,说明原大文件可能有部分坏行,或者Oracle加载大文件时遇到了资源问题;如果小文件也读不到,那肯定是建表语句或者权限的问题。
内容的提问来源于stack exchange,提问作者Laerte Junior




