关于 CREATE EXTERNAL TABLE ext_tb1(CNT int AS (metadata$filecol2), name char(10) AS (metadata$filecol3)) LOCATION = ‘file:///home/test/extDir/’ FORMAT = (TYPE=‘CSV’, LINE_DELIMITER=’\n’, FIELD_DELIMITER=’"’) PATTERN=‘tb1.csv’ 语句的解释,正确的是:
A. 如果多台 OBServer 的 /home/test/extDir/ 目录均包含 tb1.csv 文件,OceanBase 会将该目录下所有匹配 PATTERN 的文件与该表关联(各节点读取本节点文件)
B. 语句创建了一个名为 ext_tb1 的表,并将外部文件内容导入到 ext_tb1 中
C. 外表字段与文件列通过位置映射(metadata$filecolN 表示文件第 N 列)
D. 以上说法均错误
A的答案有点歧义,主要是【各节点读取本节点文件】这句话。 逻辑上外表访问时肯定是获取的所有节点上符合匹配规则的所有数据,不会是只读取本地节点的数据。
1 个赞
嗯,排除B没有异议,创建外表时并不会有什么导入的动作。
主要是A选项。
关于A的疑惑是,如果我在一个observe节点上配置了数据文件的路径,其他节点需要单独连上去再设置一遍吗?
举例来说:
假设一个1:1:1的集群,每个zone各一个observe,分别是ABC。
我在A上配置了外表数据文件的路径,B和C上还要去单独配置一遍吗?
如果B和C需要单独配置一遍,那ABC可以分别配置不同的外表数据文件的本地路径吗?
先回答【ABC可以分别配置不同的外表数据文件的本地路径】
我理解不能,从语法上来看,表结构定义只支持一个固定的路径,不支持每个服务器不同路径配置。
【我在A上配置了外表数据文件的路径,B和C上还要去单独配置一遍吗?】
不是必须的,可以这么理解,假设外表路径是/data/ext, A服务器下有,B和C不一定需要有。 但如果B或者C也有这个/data/ext路径,读取时也会一并扫描对应文件,查询这个外表时,返回的是所有节点合并后的数据
1 个赞
感谢版主的回复 
再追加一个问题,如果多个observe的本地路径下有同名数据文件。
并且数据文件内容是完全一样的,那创建的外表是合并这些数据,还是会去重只保留一份数据?
好问题,从逻辑上肯定是不会去重,查询时会出现多条重复。 不过想到另一个场景,如果表定义不允许重复,不确定会不会报错(没做实际验证)
1 个赞
这个问题问了一下AI,给我回答了一大堆,我觉得它给的这张图能完整解答这个问题了。
版主大人你看看这张图靠谱吗?现在有点不太信得过AI给的东西了 
去不去重的这部分我不确定,4.4.2确实有sfile的语法了,但是是针对LOAD DATA,不确定外表是不是一个逻辑,这个需要实际做验证才能有结论了(主要暂时没环境做验证)
【 LOAD DATA FROM FILES 支持共享 NAS 文件去重导入 :新增 sfile:// 协议表示共享本地文件。多个 OBServer 挂载同一 NAS 目录时,使用 sfile:// 可避免同一逻辑文件被多台机器重复导入。普通本地文件仍使用 file://】
1 个赞