摘要: 大數據計算服務 MaxCompute 可以提供強大的分析能力,而分佈式 NoSQL 數據庫表格存儲在行級別上的實時更新和可覆蓋性寫入等特性,相對於 MaxCompute 內置表 append-only 批量操做,提供了一個很好的補充。html
關係數據庫已經存在半個世紀,有很是普遍的使用場景,可是在快速迭代的互聯網領域其擴展性和 schema 靈活性被詬病頗多,所以相似 TableStore/BigTable/HBase 等強調擴展性和靈活性的NoSQL數據庫逐步流行起來,這些 NoSQL 數據庫只提供 API 接口,不提供 SQL 訪問,這就致使不少熟悉 SQL 可是不喜歡寫代碼的用戶無法很舒服的使用此類NoSQL數據庫。基於此,表格存儲開發團隊聯合 MaxCompute(下文中 ODPS 與 MaxCompute 同義)團隊打通了 ODPS-SQL 訪問表格存儲的路徑,這樣一個只懂 SQL 的用戶也能夠愉快的訪問表格存儲裏面的大量數據了。git
本篇文章就以一個小白用戶的身份體驗如何使用 MaxCompute-SQL 查詢表格存儲裏面的數據,以及如何開發自定義邏輯(User Defined Function, UDF)來處理用戶特定的數據格式。sql
什麼是表格存儲 TableStore?數據庫
分佈式NoSQL數據存儲服務,無縫支持單表PB級數據及百萬級訪問併發,彈性資源,按量計費,對數據高頻的增、刪、改支持的很好,保證單行數據讀寫的強一致性。json
什麼是大數據計算服務 MaxCompute?api
一種快速、徹底託管的TB/PB級數據倉庫解決方案,提供多種經典的分佈式計算模型,可以更快速的解決用戶海量數據計算問題。瀏覽器
下面首先咱們將介紹環境準備,這是全部後面的操做的基礎。而後會介紹使用 OdpsCmd 訪問表格存儲。在第三節咱們介紹使用 OdpsStudio 訪問表格存儲。最後介紹如何寫 UDF、部署 UDF 以及在查詢中使用 UDF。網絡
環境準備併發
首先,準備好一個 MaxCompute 的工程,工程建立指導文檔,準備好AccessId和AccessKey備用,爲了區別其餘產品的AccessId和AccessKey,後面咱們稱之爲ODPS-AccessId,ODPS-AccessKey。並在RAM中受權 MaxCompute 訪問 TableStore 的權限,受權方式請參考MaxCompute訪問TableStore數據——受權app
小提示:因爲 MaxCompute 在 2.0 版本的計算框架才能支持直接訪問 TableStore 數據,該版本還在灰度上線中,目前還須要 申請MaxCompute 2.0試用,具體開通使用方法請參見 如何申請試用MaxCompute 2.0。
而後,準備好一個表格存儲的實例以及一張數據表,表格存儲實例管理,準備好實例名、EndPoint,爲了區別其餘產品的AccessId和AccessKey,後面咱們稱之爲TableStore-InstanceName,TableStore-EndPoint。
網絡連通性
MaxCompute 與 TableStore 是兩個獨立的大數據計算以及大數據存儲服務,因此二者之間的網絡必須保證連通性。 對於 MaxCompute 公共雲服務訪問 TableStore 存儲,推薦使用 TableStore 私網 地址,例如http://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com。
若是網絡不通,可使用公網地址,TableStore原生支持 VPC 網絡控制,也須要將網絡類型設置爲 "容許任意網絡訪問"。
使用客戶端 ODPS-CMD
1.下載並安裝大數據計算服務客戶端
2.下載解壓,將conf/odps_config.ini 的內容修改成:
project_name=上面申請的ODPS工程名
access_id=ODPS-AccessId
access_key= ODPS-AccessKey
end_point=http://service-corp.odps.aliyun-inc.com/api
https_check=true
# confirm threshold for query input size(unit: GB)
data_size_confirm=100.0
# this url is for odpscmd update
update_url=http://repo.aliyun.com/odpscmd
3.行bin/odpscmd,輸入show tables,正常執行則表示上面配置正確。
4.在bin/odpscmd 下輸入環境變量,顯式開啓 ODPS 2.0 的非結構化功能( 僅在 ODPS 2.0 計算框架徹底上線爲必須),單獨執行 xx.sql 文件時也須要將下屬設置寫在 SQL 文件的開頭處。
set odps.task.major.version=2dot0_demo_flighting;
set odps.sql.planner.mode=lot;
set odps.sql.ddl.odps2=true;
set odps.sql.preparse.odps2=lot;
set odps.sql.type.system.odps2=true; --是支持表格存儲的binary類型
5.建立一張 MaxCompute 的數據表關聯到 TableStore 的某一張表。
關聯的數據表信息以下:
DROP TABLE IF EXISTS ots_vehicle_track;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_vehicle_track
(
vid bigint,
gt bigint,
longitude double,
latitude double,
distance double ,
speed double,
oil_consumption double
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)
WITH SERDEPROPERTIES ( -- (2)
'tablestore.columns.mapping'=':vid, :gt, longitude, latitude, distance, speed, oil_consumption', -- (3)
'tablestore.table.name'='vehicle_track' -- (4)
)
LOCATION 'tablestore://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)
TableStore數據類型 |
MaxCompute數據類型 |
string |
string |
binary |
blob |
int |
bigint |
double |
double |
6.執行ODPS-SQL
// 統計編號 4 如下的車輛在時間戳 1469171387 之前的平均速度和平均油耗
select vid,count(*),avg(speed),avg(oil_consumption) from ots_vehicle_track where vid <4 and gt<1469171387 group by vid;
使用 UDF(User Defined Function)處理數據
有時候用戶在表格存儲裏面的數據有獨特的結構,但願本身開發邏輯來處理每一行數據,好比解析特定的json字符串,這一塊的開發也已經很方便了。
1.按照MaxCompute Studio文檔的說明在IntelliJ裏面安裝MaxCompute-Java/MaxCompute-Studio插件,一旦插件安裝完畢,就能夠直接開發。
好比下面就是一個簡單的 UDF 定義,只是簡單的將兩個字符串鏈接。 MaxCompute 支持更復雜的UDF,包括自定義窗口執行邏輯等,詳細請參考MaxCompute Studio-開發 UDF。
2.打包以後能夠上傳到 MaxCompute,其中打包這裏有須要注意的地方,File->Project Structure->Artifacts, 填寫好 Name 和 Output Directory 後,要點擊 + 選擇輸出模塊,打包後經過 ODPS Project Explorer 來上傳資源、建立函數,而後就能夠在SQL中調用。
3.打開bin/odpscmd,輸入
// 咱們選出來1行數據,並將name/name傳入UDF,返回兩個string的累加
select cloud_metric_extract_md5(name, name) as udf_test from test_table limit 1;
寫在最後
目前ODPS-SQL訪問 TaleStore 還在對執行邏輯進行深度的優化,若是有需求請聯繫ots_support,咱們將針對業務場景來進行優化。
FAQ
常見錯誤處理: