我们各种不同的表支持不同的table properties,如下

table_mapping

当DLA里面的表名跟底层数据与的表名不一致的时候,可以用这个property来指定底层数据与的表名,比如我们DLA的表名是 person, 而底层的表名叫 staff, 那么可以这么写:

​​​​​​​create external table person (
    id int,
    name string,
    age int
) tblproperties(
  table_mapping = 'staff'
);​

column_mapping

当DLA里面的列名跟底层数据与的列名不一致的时候,或者底层压根就没有列的概念的时候,可以用这个property来指定底层数据与DLA列名的对应关系。

比如下面这个例子:

​create external table person (
    id int,
    name string,
    age int
) tblproperties(
  column_mapping = 'id,identifier;name,title;'
);​

DLA的列名 id 对应到了底层的 identifier, name 对应到了 title, 而没有指定的 age 则对应到底层的 age

OSS

auto.create.location

auto.create.location 的作用是我们可以指定一个OSS上一个不存在的目录来建表,而DLA会自动创建OSS上对应的目录。比如:

​CREATE EXTERNAL TABLE person (
    `id` int,
    `name` string,
    `age` int    
)
STORED AS TEXTFILE
LOCATION 'oss://bucket001/dir001/'
TBLPROPERTIES (
    'auto.create.location'='true'
);​

compression.type

使用DLA写入OSS的数据默认的压缩格式是SNAPPY,如果不喜欢可以使用 compression.type 手动指定压缩格式:

​CREATE EXTERNAL TABLE person (
    `id` int,
    `name` string,
    `age` int    
)
STORED AS TEXTFILE
LOCATION 'oss://bucket001/dir001/'
TBLPROPERTIES (
    'compression.type'='gzip'
);​

目前支持的压缩格式有:

  • SNAPPY
  • GZIP
  • NONE(不压缩)

directory.odps

当需要使用DLA分析MaxCompute的OSS外表数据时,需要指定这个参数:

​CREATE EXTERNAL TABLE person (
    `id` int,
    `name` string,
    `age` int    
)
STORED AS TEXTFILE
LOCATION 'oss://bucket001/dir001/'
TBLPROPERTIES (
    'directory.odps'='true'
);​

这是因为MaxCompute外表的目录结构和普通OSS不同,如果不指定这个参数会导致找不到数据文件。

skip.header.line.count

skip.header.line.count 针对文本类型的数据,指定要跳过的行数,比如有些CSV文件第一行是文件头,不是真正的数据,分析的时候需要跳过。
CREATE EXTERNAL TABLE person (
    `id` int,
    `name` string,
    `age` int    
)
STORED AS TEXTFILE
LOCATION 'oss://bucket001/dir001/'
TBLPROPERTIES ("skip.header.line.count"="1");