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還在不斷完善中,歡迎你們試用,提出您的寶貴意見或建議。

 



本文做者:金絡

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索