MaxCompute基本概念和數據類型

MaxCompute基本概念

MaxCompute的核心概念主要包括:項目、表、分區、生命週期、資源、函數、任務、任務實例(實例)、ACID語義等。MaxComopute常用術語表參見:MaxCompute術語表

項目(Project)

項目(Project)是MaxCompute的基本組織單元,它類似於傳統數據庫的Database或Schema的概念,是進行多用戶隔離和訪問控制的主要邊界。項目中包含多個對象,例如表(Table)、資源(Resource)、函數(Function)和實例(Instance)等。

一個用戶可以同時擁有多個項目的權限。通過安全授權,可以在一個項目中訪問另一個項目中的對象,詳情請參見基於Package的跨項目空間資源訪問

可以通過use project命令進入一個項目,例如使用如下命令進入一個名爲my_project的項目,可以直接操作該項目下的對象,例如表、資源、函數和實例等。

--進入一個名爲my_project的項目空間。
use my_project;

表(Table)

表是MaxCompute的數據存儲單元。它在邏輯上是由行和列組成的二維結構,每行代表一條記錄,每列表示相同數據類型的一個字段,一條記錄可以包含一個或多個列,表的結構由各個列的名稱和類型構成。MaxCompute中不同類型計算任務的操作對象(輸入、輸出)都是表。可以創建表、刪除表以及導入數據到表或從表中導出數據。

MaxCompute的表格有兩種類型:內部表和外部表(MaxCompute2.0版本開始支持外部表)。

  • 對於內部表,所有的數據都被存儲在MaxCompute中,表中列的數據類型可以是MaxCompute支持的任意一種數據類型。
  • 對於外部表,MaxCompute並不真正持有數據,表格的數據可以存放在OSSOTS中 。MaxCompute僅會記錄表格的Meta信息,您可以通過MaxCompute的外部表機制處理OSS或OTS上的非結構化數據,例如視頻、音頻、基因、氣象、地理信息等。

分區(Partitions)

分區表是指擁有分區空間的表,即在創建表時指定表內的一個或者某幾個字段作爲分區列。分區表實際就是對應分佈式文件系統上的獨立的文件夾,一個分區對應一個文件夾,文件夾下是對應分區所有的數據文件。

分區可以理解爲分類,通過分類把不同類型的數據放到不同的目錄下。分類的標準就是分區字段,可以是一個,也可以是多個。MaxCompute將分區列的每個值作爲一個分區(目錄),可以指定多級分區,即將表的多個字段作爲表的分區,分區之間類似多級目錄的關係。

分區表的意義在於優化查詢。查詢表時通過WHERE子句查詢指定所需查詢的分區,避免全表掃描,提高處理效率,降低計算費用。使用數據時,如果指定需要訪問的分區名稱,則只會讀取相應的分區。分區表

分區使用示例:

--創建一個二級分區表,以日期爲一級分區,地域爲二級分區
CREATE TABLE src (
    key string, 
    value bigint
) 
PARTITIONED BY (pt string, region string);

--正確使用方式。MaxCompute在生成查詢計劃時只會將'20170601'分區下region爲'hangzhou'二級分區的數據納入輸入中。
select * from src where pt='20170601'and region='hangzhou'; 

MaxCompute2.0數據類型版本支持的分區字段爲TINYINT、SMALLINT、INT、BIGINT、VARCHAR、STRING。

生命週期(Lifecycle)

MaxCompute表的生命週期(Lifecycle),指表(分區)數據從最後一次更新的時間算起,在經過指定的時間後沒有變動,則此表(分區)將被MaxCompute自動回收。這個指定的時間就是生命週期。

  • 生命週期單位爲天,取值爲正整數。
  • 對於非分區表,如果表數據在生命週期內沒有被修改,經過指定天數後此表將會被MaxCompute自動回收(類似DROP TABLE操作)。生命週期從最後一次表數據被修改的時間(LastDataModifiedTime)起開始計算。
  • 對於分區表,每個分區可以分別被回收。在生命週期內未被修改數據的分區,經過指定的天數後此分區將會被回收,否則會被保留。每個分區的生命週期是從最後一次分區數據被修改的時間(LastDataModifiedTime)起開始計算。不同於非分區表,分區表的最後一個分區被回收後,該表不會被刪除。
  • 生命週期主要提供定期回收表或分區的功能,每天根據服務的繁忙程度,不定時回收。不能確保表或分區的生命週期到期後,立刻被回收。
  • 只能在表級別設置生命週期,不能在分區級設置生命週期。爲分區表指定的生命週期,適用於該表所有的分區。創建表時即可指定生命週期。
  • 如果沒有爲表指定生命週期,則表(分區)不會根據生命週期規則被MaxCompute自動回收。

資源(Resource)

資源(Resource)是MaxCompute的特有概念,MaxCompute的UDF和MapReduce功能需要依賴資源來完成,如下所示:

  • SQL UDF:編寫UDF後,需要將編譯好的Jar包以資源的形式上傳到MaxCompute。運行此UDF時,MaxCompute會自動下載這個Jar包,獲取代碼來運行UDF。上傳Jar包的過程就是在MaxCompute上創建資源的過程,這個Jar包是MaxCompute資源的一種。
  • MapReduce:編寫MapReduce程序後,將編譯好的Jar包作爲一種資源上傳到MaxCompute。運行MapReduce作業時,MapReduce框架會自動下載這個Jar資源獲取代碼。同樣可以將文本文件以及MaxCompute中的表作爲不同類型的資源上傳到MaxCompute,在UDF及MapReduce的運行過程中讀取、使用這些資源。

MaxCompute支持上傳的單個資源大小上限爲500MB,資源包括以下幾種類型:

  • File類型。
  • Table類型:MaxCompute中的表。MapReduce引用的table類型資源中,table字段類型目前只支持BIGINT、DOUBLE、STRING、DATETIME、BOOLEAN,其他類型暫未支持。
  • Jar類型:編譯好的Java Jar包。
  • Archive類型:通過資源名稱中的後綴識別壓縮類型,支持的壓縮文件類型包括.zip/.tgz/.tar.gz/.tar/jar。

函數(Function)

MaxCompute您提供了SQL計算功能,可以在MaxCompute SQL中使用系統的內建函數完成一定的計算和計數功能。但當內建函數無法滿足要求時,可以使用MaxCompute提供的Java編程接口開發自定義函數(User Defined Function,以下簡稱UDF)。

自定義函數(UDF)可以進一步分爲標量值函數(UDF),自定義聚合函數(UDAF)和自定義表值函數(UDTF)三種類型。

使用步驟:在開發完成UDF代碼後,需要將代碼編譯成Jar包,並將此Jar包以Jar資源的形式上傳到MaxCompute,最後在MaxCompute中註冊此UDF。具體可見:MaxCompute數據開發快速入門

任務(Task)

任務(Task)是MaxCompute的基本計算單元,SQL及MapReduce功能都是通過任務完成的。

對於提交的大多數任務,特別是計算型任務,例如SQL DML語句,MapReduce,MaxCompute會對其進行解析,得到任務的執行計劃。執行計劃由具有依賴關係的多個執行階段(Stage)構成。

目前,執行計劃邏輯上可以被看做一個有向圖,圖中的點是執行階段,各個執行階段的依賴關係是圖的邊。MaxCompute會依照圖(執行計劃)中的依賴關係執行各個階段。在同一個執行階段內,會有多個進程,也稱之爲Worker,共同完成該執行階段的計算工作。同一個執行階段的不同Worker只是處理的數據不同,執行邏輯完全相同。計算型任務在執行時,會被實例化,您可以對這個實例(Instance)進行操作,例如獲取實例狀態(Status Instance)終止實例運行(Kill Instance)等。

部分MaxCompute任務並不是計算型的任務,例如SQL中的DDL語句,這些任務本質上僅需要讀取、修改MaxCompute中的元數據信息。因此,這些任務無法被解析出執行計劃。

任務實例

在MaxCompute中,部分Task在執行時會被實例化,以MaxCompute實例(下文簡稱爲實例或Instance)的形式存在。實例會經歷運行(Running)和結束(Terminated)兩個階段。

運行階段的實例狀態爲Running(運行中),而結束階段則會有Success(成功)、Failed(失敗)和Canceled(被取消)三種狀態。可以根據運行任務時MaxCompute給出的實例ID進行查詢、改變任務的狀態等操作,示例如下。

--查看某實例的狀態。
status instance_id;
--停止某實例,將其狀態設置爲Canceled。
kill instance_id; 
--查看某實例的運行日誌。
wait instance_id; 

MaxCompute數據類型

數據類型版本

MaxCompute 2.0推出之後,MaxCompute中包含的數據類型版本存在三個:

  1. MaxCompute 1.0數據類型
  2. MaxCompute 2.0數據類型
  3. MaxCompute兼容Hive數據類型

MaxCompute設置數據類型版本屬性的參數共有3個:

  • odps.sql.type.system.odps2:MaxCompute 2.0數據類型版本的開關,屬性值爲True和False。
  • odps.sql.decimal.odps2:MaxCompute 2.0的Decimal數據類型的開關,屬性值爲True和False。
  • odps.sql.hive.compatible:MaxCompute Hive兼容模式(即部分數據類型和SQL行爲兼容Hive)數據類型版本的開關,屬性值爲True和False。

在新增項目時MaxCompute可以對3個版本的數據類型進行選擇,各個版本默認設置如下:

1. MaxCompute 1.0數據類型版本

setproject odps.sql.type.system.odps2=false;--關閉MaxCompute 2.0數據類型。
setproject odps.sql.decimal.odps2=false;--關閉Decimal 2.0數據類型。
setproject odps.sql.hive.compatible=false;--關閉Hive兼容模式。

適用於早期使用的MaxCompute項目,且該項目依賴的產品組件不支持2.0數據類型版本。

2. MaxCompute 2.0數據類型版本

setproject odps.sql.type.system.odps2=true;--打開MaxCompute 2.0數據類型。
setproject odps.sql.decimal.odps2=true;--打開Decimal 2.0數據類型。
setproject odps.sql.hive.compatible=false;--關閉Hive兼容模式。

適用於在2020年04月之前無存量數據的MaxCompute項目,且該項目依賴的產品組件支持2.0數據類型版本。

查看和修改數據類型

--查看項目數據類型版本。
setproject; 
--開啓/關閉MaxCompute2.0數據類型版本。
setproject odps.sql.type.system.odps2=true/false;
--開啓/關閉decimal2.0數據類型。
setproject odps.sql.decimal.odps2=true/false;
--開啓/關閉hive兼容模式數據類型版本。
setproject odps.sql.hive.compatible=true/false;

MaxCompute 1.0數據類型

類型 常量示例 描述
BIGINT 100000000000L、-1L 64位有符號整型。

取值範圍:-2 63 +1~2 63 -1。

DOUBLE 3.1415926 1E+7 64位二進制浮點型。
DECIMAL 3.5BD、99999999999.9999999BD 10進制精確數字類型。

整型部分取值範圍:-10 36 +1~10 36 -1, 小數部分精確到10 -18 。固定54位數字,其中整數部分36位,小數位爲18位。

STRING “abc”、’bcd’、”alibaba”、‘inc’ 字符串類型,目前長度限制爲8MB。
DATETIME DATETIME ‘2017-11-11 00:00:00’ 日期時間類型。

取值範圍:0000年1月1日~9999年12月31日,精確到毫秒。

BOOLEAN True、False BOOLEAN類型。

取值範圍:True、False。

對於上述數據類型說明如下:

  • 上述的各種數據類型均可爲NULL。
  • 整型常量的語義默認爲BIGINT類型。如果常量過長,超過了BIGINT的值域(例如1,000,000,000,000,000,000,000,000)則會被作爲DOUBLE類型處理。例如SELECT 1 + a;中的整型常量1會被作爲BIGINT類型處理。
  • 參數涉及2.0數據類型的內置函數,在1.0數據類型版本下無法正常使用。
  • 分區表的分區列的數據類型只支持STRING類型。

MaxCompute 2.0數據類型

類型 常量示例 描述
TINYINT 1Y、-127Y 8位有符號整型。

取值範圍:-128~127。

SMALLINT 32767S、-100S 16位有符號整型。

取值範圍:-32768~32767。

INT 1000、-15645787 32位有符號整型。

取值範圍:-2 31 ~2 31 -1。

BIGINT 100000000000L、-1L 64位有符號整型。

取值範圍:-2 63 +1~2 63 -1。

BINARY 二進制數據類型,目前長度限制爲8MB。
FLOAT 32位二進制浮點型。
DOUBLE 3.1415926 1E+7 64位二進制浮點型。
DECIMAL(precision, scale) 3.5BD、99999999999.9999999BD 10進制精確數字類型。
  • precision:表示最多可以表示多少位的數字。取值範圍:1 <= precision <= 38
  • scale:表示小數部分的位數。取值範圍: 0 <= scale <= 18

如果不指定以上兩個參數,則默認爲decimal(38,18)

VARCHAR(n) 變長字符類型,n爲長度。

取值範圍:1~65535。

CHAR(n) 固定長度字符類型,n爲長度。最大取值255。長度不足則會填充空格,但空格不參與比較。
STRING “abc”、’bcd’、”alibaba”、‘inc’ 字符串類型,目前長度限制爲8MB。
DATE DATE'2017-11-11' 日期類型,格式爲yyyy-mm-dd

取值範圍:0000-01-01~9999-12-31。

DATETIME DATETIME ‘2017-11-11 00:00:00’ 日期時間類型。

取值範圍:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精確到毫秒。

TIMESTAMP TIMESTAMP ‘2017-11-11 00:00:00.123456789’ 與時區無關的時間戳類型。

取值範圍:0000-01-01 00:00:00.000000000~9999-12-3123.59:59.999999999,精確到納秒。

說明 對於部分時區相關的函數,例如cast(<a timestamp> as string),要求TIMESTAMP按照與當前時區相符的方式來展現。

BOOLEAN True、False BOOLEAN類型。

取值範圍:True、False。

支持的複雜數據類型:

類型 定義方法 構造方法
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’, ‘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)

以上數據類型的具體說明,以及MaxCompute各類數據類型的區別,詳見:MaxCompute 2.0數據類型

Hive兼容數據類型

Hive兼容數據類型版本支持的基礎數據類型與2.0數據類型定義基本一致,只有Decimal數據類型在兩個版本下有些差異。具體見:Hive兼容數據類型版本

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章