大量數(shù)據(jù)導(dǎo)出方案
本文將通過示例,為您介紹導(dǎo)出MaxCompute SQL計算結(jié)果的方法。
本文中所有SDK部分僅以Java舉例。
概述
您可以通過以下方法導(dǎo)出SQL的運行結(jié)果:
SQLTask方式導(dǎo)出
SQLTask使用SDK方法,直接調(diào)用MaxCompute SQL的接口SQLTask.getResult(i),可以很方便地運行SQL并獲得其返回結(jié)果。使用方法請參見SQLTask。
使用SQLTask時,請注意:
SQLTask.getResult(i)用于導(dǎo)出SELECT查詢結(jié)果,不適用于導(dǎo)出show tables等其他MaxCompute命令操作結(jié)果。
SELECT語句返回給客戶端的數(shù)據(jù)條數(shù)可以通過READ_TABLE_MAX_ROW進行設(shè)置,詳情請參見項目空間操作。
SELECT語句最多返回1萬條數(shù)據(jù)至客戶端。即如果在客戶端(包括SQLTask)直接執(zhí)行SELECT語句,相當于在SELECT語句最后加了Limit N。
Tunnel方式導(dǎo)出
如果您需要導(dǎo)出的查詢結(jié)果是某張表的全部內(nèi)容(或者是具體的某個分區(qū)的全部內(nèi)容),可以通過Tunnel來實現(xiàn),詳情請參見命令行工具 和基于SDK編寫的Tunnel SDK。
此處提供一個Tunnel命令行導(dǎo)出數(shù)據(jù)的簡單示例,Tunnel SDK的編寫適用于Tunnel命令行無法支持的場景,詳情請參見批量數(shù)據(jù)通道概述。
tunnel d wc_out c:\wc_out.dat;
2016-12-16 19:32:08 - new session: 201612161932082d3c9b0a012f68e7 total lines: 3
2016-12-16 19:32:08 - file [0]: [0, 3), c:\wc_out.dat
downloading 3 records into 1 file
2016-12-16 19:32:08 - file [0] start
2016-12-16 19:32:08 - file [0] OK. total: 21 bytes
download OK
SQLTask配合Tunnel方式導(dǎo)出
SQLTask不能處理超過1萬條數(shù)據(jù),而Tunnel方式可以,兩者可以互補,因此可以基于兩者實現(xiàn)超過1萬條數(shù)據(jù)的導(dǎo)出。
代碼實現(xiàn)的示例如下。
Odps odps = OdpsUtils.newDefaultOdps(); // 初始化Odps對象。
Instance i = SQLTask.run(odps, "select * from wc_in;");
i.waitForSuccess();
//創(chuàng)建InstanceTunnel。
InstanceTunnel tunnel = new InstanceTunnel(odps);
//根據(jù)instance id,創(chuàng)建DownloadSession。
InstanceTunnel.DownloadSession session = tunnel.createDownloadSession(odps.getDefaultProject(), i.getId());
long count = session.getRecordCount();
//輸出結(jié)果條數(shù)。
System.out.println(count);
//獲取數(shù)據(jù)的寫法與TableTunnel一樣。
TunnelRecordReader reader = session.openRecordReader(0, count);
Record record;
while((record = reader.read()) != null)
{
for(int col = 0; col < session.getSchema().getColumns().size(); ++col)
{
//wc_in表字段均為STRING,這里直接打印輸出,或者用戶可以直接寫出到本地文件
System.out.println(record.get(col));
}
}
reader.close();
DataWorks數(shù)據(jù)同步方式導(dǎo)出
DataWorks支持運行SQL并配置數(shù)據(jù)同步任務(wù),以完成數(shù)據(jù)生成和導(dǎo)出需求。
登錄DataWorks控制臺。
在左側(cè)導(dǎo)航欄,單擊工作空間列表。
單擊相應(yīng)工作空間操作列的快速進入 > 數(shù)據(jù)開發(fā)。
新建業(yè)務(wù)流程。
右鍵單擊業(yè)務(wù)流程,選擇新建業(yè)務(wù)流程
輸入業(yè)務(wù)名稱。
單擊新建。
創(chuàng)建SQL節(jié)點。
右鍵單擊業(yè)務(wù)流程,選擇
。填寫節(jié)點名稱為runsql,單擊確認。
配置ODPS SQL節(jié)點,配置完成后單擊保存。
創(chuàng)建數(shù)據(jù)同步節(jié)點。
右鍵單擊業(yè)務(wù)流程,選擇
。填寫節(jié)點名稱為sync2mysql,單擊確認。
選擇數(shù)據(jù)來源以及去向。
配置字段映射。
配置通道控制。
單擊保存。
將數(shù)據(jù)同步節(jié)點和ODPS SQL節(jié)點連線配置成依賴關(guān)系,ODPS SQL節(jié)點作為數(shù)據(jù)的產(chǎn)出節(jié)點,數(shù)據(jù)同步節(jié)點作為數(shù)據(jù)的導(dǎo)出節(jié)點。
工作流調(diào)度配置完成后(可以直接使用默認配置),單擊運行。數(shù)據(jù)同步的運行日志,如下所示。
2016-12-17 23:43:46.394 [job-15598025] INFO JobContainer - 任務(wù)啟動時刻 : 2016-12-17 23:43:34 任務(wù)結(jié)束時刻 : 2016-12-17 23:43:46 任務(wù)總計耗時 : 11s 任務(wù)平均流量 : 31.36KB/s 記錄寫入速度 : 1668rec/s 讀出記錄總數(shù) : 16689 讀寫失敗總數(shù) : 0
執(zhí)行如下SQL語句查看數(shù)據(jù)同步的結(jié)果。
select count(*) from result_in_db;