外部表
本文將為您介紹如何通過DataWorks創(chuàng)建、配置外部表,以及外部表支持的字段類型。
外部表概述
使用外部表前,您需要了解下表中的定義。
名稱 | 描述 |
對象存儲OSS | 提供標(biāo)準(zhǔn)、低頻、歸檔存儲類型,能夠覆蓋不同的存儲場景。同時,OSS能夠與Hadoop開源社區(qū)及EMR、批量計算、MaxCompute、機(jī)器學(xué)習(xí)和函數(shù)計算等產(chǎn)品進(jìn)行深度結(jié)合。 |
MaxCompute | 大數(shù)據(jù)計算服務(wù)MaxCompute為您提供快速且完全托管的數(shù)據(jù)倉庫解決方案,并可以通過與OSS的結(jié)合,高效經(jīng)濟(jì)地分析處理海量數(shù)據(jù)。 |
MaxCompute外部表 | 該功能基于MaxCompute新一代的V2.0計算框架,可以幫助您直接對OSS中的海量文件進(jìn)行查詢,無需將數(shù)據(jù)加載至MaxCompute表中。既減少了數(shù)據(jù)遷移的時間和人力,也節(jié)省了存儲的成本。 |
下圖為外部表的整體處理架構(gòu)。
目前,MaxCompute主要支持OSS和OTS等非結(jié)構(gòu)化存儲的外部表。從數(shù)據(jù)的流動和處理邏輯的角度,非結(jié)構(gòu)化處理框架在MaxCompute計算平臺兩端有耦合地進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出。以O(shè)SS外部表為例,處理邏輯如下:
外部的OSS數(shù)據(jù)經(jīng)過非結(jié)構(gòu)化框架轉(zhuǎn)換,使用JAVA InputStream類提供給您自定義代碼接口。您可以自己實現(xiàn)Extract邏輯,只需要負(fù)責(zé)對輸入的InputStream進(jìn)行讀取、解析、轉(zhuǎn)化和計算,最終返回MaxCompute計算平臺通用的Record格式。
上述Record可以自由參與MaxCompute的SQL邏輯運(yùn)算,該部分計算基于MaxCompute內(nèi)置的結(jié)構(gòu)化SQL運(yùn)算引擎,并可能產(chǎn)生新的Record。
經(jīng)過運(yùn)算的Record傳遞給用戶自定義的Output邏輯,您可以進(jìn)行進(jìn)一步的計算轉(zhuǎn)換,并最終通過系統(tǒng)提供的OutputStream,輸出Record中需要輸出的信息,由系統(tǒng)負(fù)責(zé)寫入至OSS。
您可以通過DataWorks配合MaxCompute,對外部表進(jìn)行可視化的創(chuàng)建、搜索、查詢、配置、加工和分析等操作。
網(wǎng)絡(luò)與權(quán)限認(rèn)證
由于MaxCompute與OSS是兩個獨(dú)立的云計算與云存儲服務(wù),所以在不同的部署集群上的網(wǎng)絡(luò)連通性有可能影響MaxCompute訪問OSS的數(shù)據(jù)的可達(dá)性。在MaxCompute中訪問OSS存儲時,建議您使用OSS私網(wǎng)地址(即以-internal.aliyuncs.com結(jié)尾的host地址)。
MaxCompute需要有一個安全的授權(quán)通道訪問OSS數(shù)據(jù)。MaxCompute結(jié)合了阿里云的訪問控制服務(wù)(RAM)和令牌服務(wù)(STS)實現(xiàn)對數(shù)據(jù)的安全訪問。MaxCompute在獲取權(quán)限時,以表的創(chuàng)建者的身份在STS申請權(quán)限(OTS的權(quán)限設(shè)置與OSS一致)。
STS模式授權(quán)
MaxCompute需要直接訪問OSS的數(shù)據(jù),因此需要將OSS數(shù)據(jù)相關(guān)權(quán)限賦給MaxCompute的訪問賬號。STS是阿里云為客戶提供的一種安全令牌管理服務(wù),它是資源訪問管理(RAM)產(chǎn)品中的一員。通過STS服務(wù),獲得許可的云服務(wù)或RAM用戶,可以自主頒發(fā)自定義時效和子權(quán)限的訪問令牌。獲得訪問令牌的應(yīng)用程序,可以使用令牌直接調(diào)用阿里云服務(wù)API操作資源。
詳情請參見OSS的STS模式授權(quán)。
您可以通過以下兩種方式進(jìn)行授權(quán):
當(dāng)MaxCompute和OSS的項目所有者是同一個賬號時,請直接登錄阿里云賬號后進(jìn)行一鍵授權(quán)。
打開新建表的編輯頁面,找到物理模型設(shè)計模塊。
勾選表類型后的外部表。
單擊選擇存儲地址后的一鍵授權(quán)。
單擊云資源訪問授權(quán)對話框中的同意授權(quán)。
自定義授權(quán),在RAM中授予MaxCompute訪問OSS的權(quán)限。
登錄RAM控制臺。
說明如果MaxCompute和OSS不是同一個賬號,此處需要由OSS賬號登錄并授權(quán)。
單擊左側(cè)導(dǎo)航欄中的
。單擊創(chuàng)建角色,選擇可信實體類型為阿里云賬號,單擊下一步。
輸入角色名稱和備注。
說明設(shè)置角色名稱為AliyunODPSDefaultRole或AliyunODPSRoleForOtherUser。
選擇信任的云賬號為當(dāng)前云賬號或其他云賬號。
說明如果選擇其他云賬號,請輸入其他云賬號的ID。
- 單擊完成。
配置角色詳情。
在RAM角色管理頁面,單擊相應(yīng)的RAM角色名稱。在信任策略管理頁簽下,單擊編輯信任策略,根據(jù)自身情況輸入下述策略內(nèi)容。
--當(dāng)MaxCompute和OSS的Owner是同一個賬號。 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "odps.aliyuncs.com" ] } } ], "Version": "1" }
--當(dāng)MaxCompute和OSS的Owner不是同一個賬號。 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "MaxCompute的Owner云賬號id@odps.aliyuncs.com" ] } } ], "Version": "1" }
配置完成后,單擊保存信任策略。
配置角色授權(quán)策略,并找到授予角色訪問OSS必要的權(quán)限AliyunODPSRolePolicy,將權(quán)限AliyunODPSRolePolicy授權(quán)給該角色。如果您無法通過搜索授權(quán)找到,可以通過精確授權(quán)直接添加。
{ "Version": "1", "Statement": [ { "Action": [ "oss:ListBuckets", "oss:GetObject", "oss:ListObjects", "oss:PutObject", "oss:DeleteObject", "oss:AbortMultipartUpload", "oss:ListParts" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "ots:ListTable", "ots:DescribeTable", "ots:GetRow", "ots:PutRow", "ots:UpdateRow", "ots:DeleteRow", "ots:GetRange", "ots:BatchGetRow", "ots:BatchWriteRow", "ots:ComputeSplitPointsBySize" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "pvtz:DescribeRegions", "pvtz:DescribeZones", "pvtz:DescribeZoneInfo", "pvtz:DescribeVpcs", "pvtz:DescribeZoneRecords" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "dlf:CreateFunction", "dlf:BatchGetPartitions", "dlf:ListDatabases", "dlf:CreateLock", "dlf:UpdateFunction", "dlf:BatchUpdateTables", "dlf:DeleteTableVersion", "dlf:UpdatePartitionColumnStatistics", "dlf:ListPartitions", "dlf:DeletePartitionColumnStatistics", "dlf:BatchUpdatePartitions", "dlf:GetPartition", "dlf:BatchDeleteTableVersions", "dlf:ListFunctions", "dlf:DeleteTable", "dlf:GetTableVersion", "dlf:AbortLock", "dlf:GetTable", "dlf:BatchDeleteTables", "dlf:RenameTable", "dlf:RefreshLock", "dlf:DeletePartition", "dlf:UnLock", "dlf:GetLock", "dlf:GetDatabase", "dlf:GetFunction", "dlf:BatchCreatePartitions", "dlf:ListPartitionNames", "dlf:RenamePartition", "dlf:CreateTable", "dlf:BatchCreateTables", "dlf:UpdateTableColumnStatistics", "dlf:ListTableNames", "dlf:UpdateDatabase", "dlf:GetTableColumnStatistics", "dlf:ListFunctionNames", "dlf:ListPartitionsByFilter", "dlf:GetPartitionColumnStatistics", "dlf:CreatePartition", "dlf:CreateDatabase", "dlf:DeleteTableColumnStatistics", "dlf:ListTableVersions", "dlf:BatchDeletePartitions", "dlf:ListCatalogs", "dlf:UpdateTable", "dlf:ListTables", "dlf:DeleteDatabase", "dlf:BatchGetTables", "dlf:DeleteFunction" ], "Resource": "*", "Effect": "Allow" } ] }
使用OSS數(shù)據(jù)源
如果您已創(chuàng)建并保存了OSS數(shù)據(jù)源,請在工作空間列表頁面找到您所創(chuàng)建的工作空間,單擊操作列的管理,在數(shù)據(jù)源頁面進(jìn)行查看和使用。
創(chuàng)建外部表
DDL模式建表
進(jìn)入數(shù)據(jù)開發(fā)頁面,參見創(chuàng)建并使用MaxCompute表進(jìn)行DDL模式建表,您只需要遵守正常的MaxCompute語法即可。如果您的STS服務(wù)已成功授權(quán),則無需設(shè)置odps.properties.rolearn屬性。
DDL建表語句示例如下,其中EXTERNAL參數(shù)說明該表為外部表。
CREATE EXTERNAL TABLE IF NOT EXISTS ambulance_data_csv_external( vehicleId int, recordId int, patientId int, calls int, locationLatitute double, locationLongtitue double, recordTime string, direction string ) STORED BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' --STORED BY用于指定自定義格式StorageHandler的類名或其它外部表文件格式,必選。 with SERDEPROPERTIES ( 'delimiter'='\\|', --SERDEPROPERTIES序列化屬性參數(shù),可以通過DataAttributes傳遞到Extractor代碼中,可選。 'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-shanghai-internal.aliyuncs.com/oss-odps-test/Demo/SampleData/CustomTxt/AmbulanceData/' --外部表存放地址,必選。 USING 'odps-udf-example.jar'; --指定自定義格式時類定義所在的Jar包,如果未使用自定義格式無需指定。
關(guān)于STORED BY后接參數(shù),其中CSV或TSV文件對應(yīng)默認(rèn)內(nèi)置的StorageHandler,具體參數(shù)如下:
CSV為
com.aliyun.odps.CsvStorageHandler
,定義如何讀寫CSV格式數(shù)據(jù),數(shù)據(jù)格式約定列分隔符為英文逗號(,)、換行符為(\n)。實際參數(shù)輸入示例:STORED BY'com.aliyun.odps.CsvStorageHandler'
。TSV為
com.aliyun.odps.TsvStorageHandler
,定義如何讀寫TSV格式數(shù)據(jù),數(shù)據(jù)格式約定列分隔符為(\t)、換行符為(\n)。
STORED BY后接參數(shù)還支持ORC、PARQUET、SEQUENCEFILE、RCFILE、AVRO和TEXTFILE 開源格式外部表,如下所示。對于textFile可以指定序列化類,例如
org.apache.hive.hcatalog.data.JsonSerDe
。org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as textfile
org.apache.hadoop.hive.ql.io.orc.OrcSerde -> stored as orc
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe -> stored as parquet
org.apache.hadoop.hive.serde2.avro.AvroSerDe -> stored as avro
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as sequencefile
對于開源格式外部表,建表語句如下。
CREATE EXTERNAL TABLE [IF NOT EXISTS] (<column schemas>) [PARTITIONED BY (partition column schemas)] [ROW FORMAT SERDE ''] STORED AS [WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='${roleran}' [,'name2'='value2',...] ) ] LOCATION 'oss://${endpoint}/${bucket}/${userfilePath}/';
SERDEPROPERTIES序列化屬性列表如下所示。
屬性名
屬性值
默認(rèn)值
描述
odps.text.option.gzip.input.enabled
true/false
false
打開或關(guān)閉讀壓縮
odps.text.option.gzip.output.enabled
true/false
false
打開或關(guān)閉寫壓縮
odps.text.option.header.lines.count
非負(fù)整數(shù)
0
跳過文本文件頭N行
odps.text.option.null.indicator
字符串
空字符串
在解析或者寫出NULL值時,代表NULL的字符串
odps.text.option.ignore.empty.lines
true/false
true
是否忽略空行
odps.text.option.encoding
UTF-8/UTF-16/US-ASCII
UTF-8
指定文本的字符編碼
說明MaxCompute目前僅支持通過內(nèi)置extractor讀取OSS上gzip壓縮的CSV或TSV數(shù)據(jù),您可以選擇文件是否是gzip壓縮,不同的文件格式對應(yīng)不同的屬性設(shè)置。
LOCATION參數(shù),格式為:oss://oss-cn-shanghai-internal.aliyuncs.com/Bucket名稱/目錄名稱。您可以通過圖形對話框選擇獲得OSS目錄地址,目錄后無需加文件名稱。
DDL模式創(chuàng)建的表會出現(xiàn)在表管理的表節(jié)點(diǎn)樹下,可以通過修改其一級、二級主題來調(diào)整顯示位置。
OTS外部表
OTS外部表建表語句如下。
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external( odps_orderkey bigint, odps_orderdate string, odps_custkey bigint, odps_orderstatus string, odps_totalprice double ) STORED BY 'com.aliyun.odps.TableStoreStorageHandler' WITH SERDEPROPERTIES ( 'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey, o_orderstatus,o_totalprice', -- (3) 'tablestore.table.name'='ots_tpch_orders' 'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';
參數(shù)說明如下:
com.aliyun.odps.TableStoreStorageHandler是MaxCompute內(nèi)置的處理TableStore數(shù)據(jù)的StorageHandler。
SERDEPROPERTIES是提供參數(shù)選項的接口,在使用TableStoreStorageHandler時,有兩個必須指定的選項:tablestore.columns.mapping和 tablestore.table.name。
tablestore.columns.mapping:必選項,用來描述MaxCompute將訪問的Table Store表的列,包括主鍵和屬性以(:)打頭的用來表示Table Store主鍵,例如此語句中的
:o_orderkey
和:o_orderdate
,其它均為屬性列。Table Store支持1~4個主鍵,主鍵類型為STRING、INTEGER和BINARY,其中第一個主鍵為分區(qū)鍵。指定映射時,您必須提供指定Table Store表的所有主鍵,對于屬性列則沒有必要全部提供,可以只提供需要通過MaxCompute來訪問的屬性列。
tablestore.table.name:需要訪問的Table Store表名。如果指定的Table Store表名錯誤(不存在),則會報錯, MaxCompute不會主動去創(chuàng)建Table Store表。
LOCATION:用來指定Table Storeinstance名字、endpoint等具體信息。
圖形化建表
進(jìn)入數(shù)據(jù)開發(fā)頁面,參見創(chuàng)建并使用MaxCompute表進(jìn)行圖形化建表。外部表具有如下屬性:
基本屬性
英文表名(在新建表時輸入)
中文表名
一級、二級主題
描述
物理模型設(shè)計
表類型:請選擇為外部表。
分區(qū)類型:OTS類型外部表不支持分區(qū)。
選擇存儲地址:即LOCATION參數(shù)。您可以在物理模型設(shè)計欄中設(shè)置LOCATION參數(shù)。單擊點(diǎn)擊選擇,即可選擇存儲地址。選擇完成后,單擊一鍵授權(quán)。
選擇存儲格式:根據(jù)業(yè)務(wù)需求進(jìn)行選擇,支持CSV、TSV、ORC、PARQUET、SEQUENCEFILE、RCFILE、AVRO、TEXTFILE和自定義文件格式。如果您選擇了自定義文件格式,需要選擇自定義的資源。在提交資源時,可以自動解析出其包含的類名并可以供用戶選取。
rolearn:如果STS已授權(quán),可以不填寫。
表結(jié)構(gòu)設(shè)計
參數(shù)
描述
字段類型
MaxCompute 2.0支持TINYINT、SMALLINT、INT、BIGINT、VARCHAR和STRING類型。
操作
支持新增、修改和刪除。
長度/設(shè)置
對于VARCHAR類型,可以支持設(shè)置長度。對于復(fù)雜類型可以直接填寫復(fù)雜類型的定義。
支持的字段類型
外部表支持的簡單字段類型如下表所示。
類型 | 是否新增 | 格式舉例 | 描述 |
TINYINT | 是 | 1Y,-127Y | 8位有符號整型,范圍為-128~127。 |
SMALLINT | 是 | 32767S, -100S | 16位有符號整型,范圍為-32,768~32,767。 |
INT | 是 | 1000,-15645787 | 32位有符號整型,范圍為-2^31~2^31-1。 |
BIGINT | 否 | 100000000000L, -1L | 64位有符號整型,范圍為-2^63+1~2^63-1。 |
FLOAT | 是 | 無 | 32位二進(jìn)制浮點(diǎn)型。 |
DOUBLE | 否 | 3.1415926 1E+7 | 8字節(jié)雙精度浮點(diǎn)數(shù),64位二進(jìn)制浮點(diǎn)型。 |
DECIMAL | 否 | 3.5BD,99999999999.9999999BD | 10進(jìn)制精確數(shù)字類型,整型部分范圍為-1,036+1~1,036-1,小數(shù)部分精確到10~18。 |
VARCHAR(n) | 是 | 無 | 變長字符類型,n為長度,取值范圍為1~65,535。 |
STRING | 否 | “abc”,’bcd’,”alibaba” | 字符串類型,目前長度限制為8MB。 |
BINARY | 是 | 無 | 二進(jìn)制數(shù)據(jù)類型,目前長度限制為8MB。 |
DATETIME | 否 | DATETIME ‘2017-11-11 00:00:00’ | 日期時間類型,使用東八區(qū)時間作為系統(tǒng)標(biāo)準(zhǔn)時間。范圍0000年1月1日~9999年12月31日,精確到毫秒。 |
TIMESTAMP | 是 | TIMESTAMP ‘2017-11-11 00:00:00.123456789’ | 與時區(qū)無關(guān)的時間戳類型,范圍為0000年1月1日~9999年12月31日23.59:59.999,999,999,精確到納秒。 |
BOOLEAN | 否 | 包括TRUE和FALSE | BOOLEAN類型,取值TRUE或FALSE。 |
外部表支持的復(fù)雜字段類型如下表所示。
類型 | 定義方法 | 構(gòu)造方法 |
ARRAY | array< int >; array< struct< a:int, b:string >> | array(1, 2, 3); array(array(1, 2); array(3, 4)) |
MAP | map< string, string >; map< smallint, array< string>> | map(“k1”, “v1”, “k2”, “v2”); map(1S, array(‘a(chǎn)’, ‘b’), 2S, array(‘x’, ‘y)) |
STRUCT | struct< x:int, y:int>; struct< field1:bigint, field2:array< int>, field3:map< int, int>> | named_struct(‘x’, 1, ‘y’, 2); named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200)) |
如果需要使用MaxCompute 2.0支持的新數(shù)據(jù)類型(TINYINT、SMALLINT、 INT、 FLOAT、VARCHAR、TIMESTAMP 、BINARY或復(fù)雜類型),需要在建表語句前加上語句set odps.sql.type.system.odps2=true;
,set語句和建表語句一起提交執(zhí)行。如果需要兼容HIVE,建議加上語句odps.sql.hive.compatible=true;
。
查看和處理外部表
您可以在數(shù)據(jù)開發(fā)頁面,單擊左側(cè)導(dǎo)航欄中的表管理,查詢外部表,詳情請參見表管理。處理外部表的方式與內(nèi)部表基本一致。