天天看點

Data Lake Analytics中OSS LOCATION的使用說明前言LOCATION注意事項

前言

Data Lake Analytic

(後文簡稱 DLA)可以幫助使用者通過标準的SQL語句直接對存儲在OSS、TableStore上的資料進行查詢分析。

在查詢前,使用者需要根據資料檔案的格式和内容在DLA中建立一張表。

Data Lake Analytics + OSS資料檔案格式處理大全

一文中介紹了如何定義表的SERDE和ROW FORMAT。

本文将以存儲在OSS上的檔案為例詳細介紹如何指定表LOCATION。

LOCATION

DLA中的建表語句的文法為

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可以是資料檔案本身,也可以是資料檔案所在的目錄。

LOCATION是資料檔案

建表時可以将表直接關聯到資料檔案,此時的LOCATION需要是該檔案在OSS上的絕對路徑。

例如:

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上的目錄結構為

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           

建表語句為:

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一個檔案,即

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