【ODPS】TableTunnel单线程简单下载事例
ODPS Tunnel是ODPS的数据通道,用户能够通过Tunnel向ODPS中上传或者下载数据。眼下Tunnel仅支持表(不包含视图View)数据的上传下载。
主要接口 | 描写叙述 |
---|---|
TableTunnel |
訪问ODPS Tunnel服务的入口类。用户能够通过公网或者阿里云内网环境对ODPS 及其Tunnel进行訪问。
当用户在阿里云内网环境中。使用Tunnel内网连接下载数据时。ODPS不会将该操作产生的流量计入计费。 此外内网地址仅对杭州域的云产品有效。 |
TableTunnel.UploadSession | 表示一个向ODPS表中上传数据的会话。 |
TableTunnel.DownloadSession | 表示一个向ODPS表中下载数据的会话。 |
接口定义:
public class DownloadSession {
DownloadSession(Configuration conf, String projectName, String tableName,
String partitionSpec) throws TunnelException
DownloadSession(Configuration conf, String projectName, String tableName,
String partitionSpec, String downloadId) throws TunnelException
public String getId()
public long getRecordCount()
public TableSchema getSchema()
public DownloadSession.Status getStatus()
public RecordReader openRecordReader(long start, long count)
public RecordReader openRecordReader(long start, long count, boolean compress)
}
Download对象:
- 生命周期:从创建Download实例到下载结束
- 创建Download实例,能够通过调用构造方法创建。也能够通过TableTunnel创建。
- 请求方式:同步
- Server端会为该Download创建一个session。生成唯一downloadId标识该Download,client能够通过getId获取
- 该操作开销较大,server端会对数据文件创建索引。当文件数非常多时,该时间会比較长。
- 同一时候server端会返回总Record数。能够依据总Record数启动多个并发同一时候下载
- 下载数据:
- 请求方式:异步
- 调用openRecordReader方法,生成RecordReader实例,当中參数start标识本次下载的record的起始位置。从0開始。取值范围是 >= 0, count标识本次下载的记录数,取值范围是>0。
- 查看下载:
- 请求方式:同步
- 调用getStatus能够获取当前Download状态
- 4种状态说明:
- UNKNOWN, server端刚创建一个session时设置的初始值
- NORMAL, 创建Download对象成功
- CLOSED, 下载结束后
- EXPIRED, 下载超时
说明:分区表下载必须指定分区
事例源代码:
package bysql; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Date;
import com.aliyun.odps.Column;
import com.aliyun.odps.Odps;
import com.aliyun.odps.PartitionSpec;
import com.aliyun.odps.TableSchema;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.RecordReader;
import com.aliyun.odps.tunnel.TableTunnel;
import com.aliyun.odps.tunnel.TunnelException; public class DownloadSample { private static final String ACCESS_ID = "<your access id>";
private static final String ACCESS_KEY = "<your access Key>";
private static final String PROJECT_NAME = "<your project>";
private static final String TUNNEL_URL = "<your tunnel endpoint>";
private static final String ODPS_URL = "<your odps endpoint>"; public static void main(String args[]) throws Exception {
String tableName = "point_z";//表名 /* 先构建阿里云帐号 */
Account account = new AliyunAccount(ACCESS_ID, ACCESS_KEY); /* Odps类是ODPS SDK的入口 */
Odps odps = new Odps(account);
odps.setDefaultProject(PROJECT_NAME);// 指定默认使用的Project名称
odps.setEndpoint(ODPS_URL);// 设置ODPS服务的地址 /*訪问ODPS Tunnel服务的入口类*/
TableTunnel tunnel = new TableTunnel(odps);
tunnel.setEndpoint(TUNNEL_URL);//设置TunnelServer地址 try {
/*此处表point_z为分区表。下载时必须指定分区
* 指定下载分区
* */
PartitionSpec partitionSpec = new PartitionSpec();
partitionSpec.set("z", "1"); System.out.println("開始下载数据.........");
File file = new File("G:\\"+tableName+"(单线程).txt");//下载文件
if (file.exists()){
file.delete();
}
file.createNewFile();
long startTime = System.currentTimeMillis(); /*在分区表上创建下载会话(分区表必须指定分区,非分区表不用)*/
TableTunnel.DownloadSession downloadSession = tunnel
.createDownloadSession(PROJECT_NAME, tableName,partitionSpec); long count = downloadSession.getRecordCount();
System.out.println("RecordCount is: " + count); RecordReader recordReader = downloadSession.openRecordReader(0,
count);
Record record;
while ((record = recordReader.read()) != null) {
consumeRecord(record, downloadSession.getSchema(),file);
}
recordReader.close();
long endTime = System.currentTimeMillis();
System.out.println("总共耗时:" + (endTime - startTime) + " ms");
System.out.println("-------------------------------------------------");
} catch (TunnelException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
} private static void consumeRecord(Record record, TableSchema schema,File file)
throws IOException {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file, true), "utf-8"));
String writeStr="";
String str = null;
for (int i = 0; i < schema.getColumns().size(); i++) {
Column column = schema.getColumn(i);
String colValue = null;
switch (column.getType()) {
case BIGINT: {
Long v = record.getBigint(i);
colValue = v == null ? null : v.toString();
break;
}
case BOOLEAN: {
Boolean v = record.getBoolean(i);
colValue = v == null ? null : v.toString();
break;
}
case DATETIME: {
Date v = record.getDatetime(i);
colValue = v == null ? null : v.toString();
break;
}
case DOUBLE: {
Double v = record.getDouble(i);
colValue = v == null ? null : v.toString();
break;
}
case STRING: {
String v = record.getString(i);
colValue = v == null ? null : v.toString();
break;
}
default:
throw new RuntimeException("Unknown column type: "
+ column.getType());
}
str = colValue == null ? "null" : colValue;
if (i != schema.getColumns().size()-1){
str = schema.getColumn(i).getName()+":"+str+", ";
}else{
str = schema.getColumn(i).getName()+":"+str;
}
writeStr =writeStr+str;
}
str =str +System.getProperty("line.separator");
writeStr =writeStr +System.getProperty("line.separator");
out.write(writeStr);
out.close();
} }
【ODPS】TableTunnel单线程简单下载事例的更多相关文章
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- C# 网络编程之网页简单下载实现
这是根据<C#网络编程实例教程>中学到的知识实现的一个C#网页简单下载器,其中涉及到的知识主要是HTTP协议编程中相关类:HttpWebRequest类.HttpWebResponse类. ...
- PHP实现简单下载功能
PHP实现简单下载 PHP文件为download.php,供下载的文件为1.jpg. <?php $filename="1.jpg"; if(!file_exists($fi ...
- C#一个简单下载程序实例(可用于更新)
运行时的界面 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat ...
- PHP简单下载
·php escapeshellcmd多字节编码漏洞 ·详细讲解PHP中缓存技术的应用 ·利用PHP V5开发多任务应用程序 ·详细解析 PHP 向 MySQL 发送数据过程 ·PHP实现静态发布的方 ...
- 用Perl做个简单”下载者病毒”
一直学的perl, 有时perl不理解时就用python写一下,这样或许perl就理解了 这里参照python写法,做了个perl的版本,当然,是为了学习用,这个下载者病毒有点简单过头了 backdo ...
- spring切面-单线程简单权限判定
spring切面简单模拟用户权限判定 需求: 游客:仅注册用户 用户:修改,注册 管理员:删除,查询,修改,注册 1,文件配置 导包 src下创建applicationContext.xml文件配置如 ...
- windows下安装redis以及简单的事例
1.安装服务端下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownload我下载了一个 redis-2.0.0服务器包,解压 ...
- Scrapy基础(七)————图片的简单下载
scrapy 提供了自动下载图片到本地的功能,通过项目管道设置 一: 在setting 文件中ITEM_PIPELINE添加: 'scrapy.pipelines.images.ImagesPipel ...
随机推荐
- MVC架构下,使用NPOI读取.DOCX文档中表格的内容
1.使用NPOI,可以在没有安装office的设备上读wiod.office.2.本文只能读取.docx后缀的文档.3.MVC架构中,上传文件只能使用form表单提交,转到控制器后要依次实现文件上传. ...
- jquery IE6 下animate 动画的opacity无效
jquery IE6 下animate 动画的opacity无效,其实是有效的,因为IETester的一个小BUG 原生IE6 没问题...呵呵~~
- Spring+Spring MVC+MyBatis框架集成
目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...
- js经典闭包
setTimeout函数之循环和闭包 前言 之前对于setTimeout的一个经典问题的理解总是感到很迷惑,现在好像清晰一点了,所以把我的理解写下来,我对js的理解也不深入,如果有错误,请务必指出.以 ...
- C#.Net调用VB.Net中的MY
用过VB.NET的人应该只要MY有多强大了吧,是不是很想在C#中也能调用呢? 当然是可以的,.net作为微软的跨语言的平台,必须是能实现的,不然微软就自己打自己嘴巴了~ 回到正题上: 1.在程序中加上 ...
- 《天书夜读:从汇编语言到windows内核编程》二 C语言的流程与处理
1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下fo ...
- 通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法
线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂.由此可见线程对于高性能开发的重要性. 那么线程在计算机 ...
- 前端必须收藏的CSS3动效库!!!
现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...
- [转]动态管理视图和函数 (Transact-SQL)
动态管理视图和函数返回可用于监视服务器实例的运行状况.诊断故障以及优化性能的服务器状态信息. 重要提示 动态管理视图和函数返回特定于实现的内部状态数据. 在未来的 SQL Server 版本中,它们的 ...
- 使用Angular Router导航基础
名称 简介 Routes 路由配置,保存着那个URL对应着哪个组件,以及在哪个RouterOulet中展示组件. RouterOutlet 在HTML中标记路由内容呈现位置的占位符指令. Router ...