Data Lake Analytics中OSS LOCATION的使用说明

前言

Data Lake Analytic(后文简称 DLA)能够帮助用户经过标准的SQL语句直接对存储在OSS、TableStore上的数据进行查询分析。spa

在查询前,用户须要根据数据文件的格式和内容在DLA中建立一张表。Data Lake Analytics + OSS数据文件格式处理大全 一文中介绍了如何定义表的SERDE和ROW FORMAT。code

本文将以存储在OSS上的文件为例详细介绍如何指定表LOCATION。orm

LOCATION

DLA中的建表语句的语法为ci

CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name
    [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
    [COMMENT table_comment]
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
    [ROW FORMAT row_format]
    [STORE AS file_format]
        | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
    LOCATION oss_path

其中 LOCATION能够是数据文件自己,也能够是数据文件所在的目录。get

LOCATION是数据文件

建表时能够将表直接关联到数据文件,此时的LOCATION须要是该文件在OSS上的绝对路径。
例如:io

CREATE EXTERNAL TABLE loc_file_csv(
    N_NATIONKEY INT,
    N_NAME STRING,
    N_REGIONKEY INT,
    N_COMMENT STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION 'oss://my-bucket/datasets/test/test_create/create_table/csv/dir1/dir2/nation.csv';

LOCATION是目录

LOCATION也能够指向OSS上的目录,该目录下的文件便是表的数据文件。
建表时,能够经过设置属性 recursive.directories 来控制是遍历该目录下的全部数据文件。默认或不显式指定recursive.directories,DLA会解析为false,即不遍历。社区

例如,OSS上的目录结构为table

2018-07-05 11:16:11 1752.00B Standard oss://my-bucket/datasets/test/test_create/create_table/csv/dir1/dir2/nation.csv
2018-07-05 11:15:57 1752.00B Standard oss://my-bucket/datasets/test/test_create/create_table/csv/dir1/nation.csv
2018-07-05 11:16:17 1752.00B Standard oss://my-bucket/datasets/test/test_create/create_table/csv/nation.csv

建表语句为:form

CREATE EXTERNAL TABLE loc_file_csv(
    N_NATIONKEY INT,
    N_NAME STRING,
    N_REGIONKEY INT,
    N_COMMENT STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION 'oss://my-bucket/datasets/test/test_create/create_table/csv/'
TBLPROPERTIES ('recursive.directories' = 'false');

当recursive.directories=false,该表的数据文件为只有LOCATION下的nation.csv一个文件,即class

oss://my-bucket/datasets/test/test_create/create_table/csv/nation.csv

建表语句为:

CREATE EXTERNAL TABLE loc_file_csv(
    N_NATIONKEY INT,
    N_NAME STRING,
    N_REGIONKEY INT,
    N_COMMENT STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
LOCATION 'oss://my-bucket/datasets/test/test_create/create_table/csv/'
TBLPROPERTIES ('recursive.directories' = 'true');

当recursive.directories=true,该表的数据文件为LOCATION目录下及其子目录下的全部csv文件,即

oss://my-bucket/datasets/test/test_create/create_table/csv/nation.csv
oss://my-bucket/datasets/test/test_create/create_table/csv/dir1/nation.csv
oss://my-bucket/datasets/test/test_create/create_table/csv/dir1/dir2/nation.csv

注意事项

  1. 当LOCATION为目录时,DLA默认该目录下的数据文件为相同的数据格式,并根据建表语句中指定的SERDE解析文件。当目录下的数据文件格式不一样时,DLA会解析失败,致使表中的数据信息错误,影响查询结果。

例如,建表时指定STORED AS TEXTFILE,可是目录下除了csv文件,还有orc格式的文件。这种状况下,在建表和查询时并不会报错,可是SELECT时可能会看到数据乱码或不许确。

  1. 目前不支持CSV文件有header。当文件的第一行为header时,须要用户本身手动处理数据;不然,会将header识别为一条数据记录

为了给你们带来更好的查询分析体验, 目前DLA还在不断完善中,欢迎你们试用,提出您的宝贵意见或建议。

 



本文做者:金络

原文连接

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索