【ODPS】阿里云ODPS中带分区的表操作
1.创建分区表:
分区表有自己的分区列,而分区表则没有。
public static void createTableWithPartition(Odps odps, String createTableName)
throws Exception {
Tables tables = odps.tables();// /获取表示ODPS全部Table的集合对象
boolean a = tables.exists(createTableName);// 推断指定表test_table_jyl是否存在
if (a) {
System.out.println("指定表存在");
Table table = tables.get(createTableName);
tables.delete(createTableName);//存在就删除
} else {
System.out.println("指定表不存在");
}
System.out.println("-------------------------------------------------"); /* 创建表 */
if (tables.exists(createTableName)) {
System.out.println("指定表存在,无法创建");
} else {
System.out.println("指定表不存在,能够创建");
/* TableSchema表示ODPS中表的定义 */
TableSchema tableSchema = new TableSchema();
/* 加入列 */
Column col; // Column表示ODPS中表的列定义
col = new Column("id", OdpsType.STRING, "ID");
tableSchema.addColumn(col);
col = new Column("name", OdpsType.STRING, "姓名");
tableSchema.addColumn(col);
col = new Column("sex", OdpsType.BIGINT, "性别");
tableSchema.addColumn(col);
col = new Column("birthday", OdpsType.DATETIME, "生日");
tableSchema.addColumn(col); /* 加入分区列 */
col = new Column("province ", OdpsType.STRING, "省(分区列)");
tableSchema.addPartitionColumn(col); tables.create(createTableName, tableSchema);//创建表
System.out.println("表【" + createTableName + "】创建成功");
}
System.out.println("-------------------------------------------------"); }
2.分区表数据上传:
分区表上传数据必须指定分区。所以上传数据前必须保证存在分区,不存在就创建一个,创建分区有两种方法
/*PartitionSpec类表示一个特定分区的定义*/
String partitionColumn="province";//表中的分区列
/*第一种,直接调用带參构造函数,
* 參数格式:分区定义字符串。比方: pt='1',ds='2'
*/
PartitionSpec partitionSpec1 = new PartitionSpec(partitionColumn+"='hubei'"); /*另外一种,调用布带參数构造函数,再调用队形set方法。 */
PartitionSpec partitionSpec2 = new PartitionSpec();
partitionSpec2.set(partitionColumn, "hubei");
TableTunnel类中有两个创建创建上传会话方法:
createUploadSession
public TableTunnel.UploadSession createUploadSession(String projectName,
String tableName)
throws TunnelException
- 在非分区表上创建上传会话
-
- Parameters:
projectName- Project名称tableName- 表名,非视图- Returns:
TableTunnel.UploadSession- Throws:
TunnelException
createUploadSession
public TableTunnel.UploadSession createUploadSession(String projectName,
String tableName,
PartitionSpec partitionSpec)
throws TunnelException
- 在分区表上创建上传会话
注: 分区必须为最末级分区,如表有两级分区pt,ds, 则必须所有指定值, 不支持仅仅指定当中一个值
- Parameters:
projectName- Project名tableName- 表名,非视图partitionSpec- 指定分区PartitionSpec- Returns:
TableTunnel.UploadSession- Throws:
TunnelException
分区表必须使用带分区的构造方法。还必须保证该分区存在,否则会报异常。
public static void uploadDataToYun(Odps odps, String project, String tableName)
throws Exception {
TableTunnel tunnel = new TableTunnel(odps);
tunnel.setEndpoint(TUNNEL_URL);// 设置TunnelServer地址,没有设置TunnelServer地址的情况下自己主动选择 /*PartitionSpec类表示一个特定分区的定义*/
String partitionColumn="province";//表中的分区列
PartitionSpec partitionSpec = new PartitionSpec();
partitionSpec.set(partitionColumn, "hubei"); Table table = odps.tables().get(tableName);//获取当前表
boolean a= table.hasPartition(partitionSpec);//推断上述定义分区在表中是否存在
if(a){
System.out.println("分区已经存在,能够直接上传数据");
}else{
System.out.println("分区不存在,先创建分区再上传数据");
table.createPartition(partitionSpec);
} /*在分区表上创建上传会话*/
TableTunnel.UploadSession uploadSession = tunnel.createUploadSession(
project, tableName,partitionSpec); RecordWriter rw = uploadSession.openRecordWriter(1);
Column[] columns = new Column[4];
columns[0] = new Column("id", OdpsType.STRING);
columns[1] = new Column("name", OdpsType.STRING);
columns[2] = new Column("sex", OdpsType.BIGINT);
columns[3] = new Column("birthday", OdpsType.DATETIME);
Record r = new ArrayRecord(columns); r.setString("id", "3");
r.setString("name", "name3");
r.setBigint("sex", (long) 2);
Date date = new Date();
r.setDatetime("birthday", date);
rw.write(r);
rw.close();//一定要close,不然无法commit Long[] blocks = uploadSession.getBlockList();
uploadSession.commit(blocks);
System.out.println("数据上传成功");
}
3.測试类:
private static final String ACCESS_ID = "***********";
private static final String ACCESS_KEY = "***************";
private static final String PROJECT_NAME = "*************";
private static final String TUNNEL_URL = "http://dt.odps.aliyun.com";
private static final String ODPS_URL = "http://service.odps.aliyun.com/api"; public static void main(String args[]) throws Exception { /* 先构建阿里云帐号 */
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服务的地址 String tableName="test_table_jyl";
/*创建带分区的表*/
createTableWithPartition(odps,tableName); /*上传数据*/
uploadDataToYun(odps, PROJECT_NAME, tableName);
}
【ODPS】阿里云ODPS中带分区的表操作的更多相关文章
- 大数据平台Hive数据迁移至阿里云ODPS平台流程与问题记录
一.背景介绍 最近几天,接到公司的一个将当前大数据平台数据全部迁移到阿里云ODPS平台上的任务.而申请的这个ODPS平台是属于政务内网的,因考虑到安全问题当前的大数据平台与阿里云ODPS的网络是不通的 ...
- 阿里云centos中mysql的安装及一些常识知识
------------------------------------------------------------------- 阿里云centos中mysql的安装 工具WinSCP v ...
- 使用Navicat连接阿里云服务器中的Mysql数据库
1.首先将阿里云服务器中的安全组添加上Mysql的端口3306,如下图所示: 步骤就是进入到阿里云的官网,点击右上角控制台,在左边选择云服务器ECS--->实例 点击图中的管理按钮,然后选择本实 ...
- 第69节:Java中数据库的多表操作
第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...
- 阿里云ODPS <====>蚂蚁大数据
1.命令行客户端工具的安装参考文档:http://repo.aliyun.com/odpscmd/?spm=a2c4g.11186623.2.17.5c185c23zHshCq 2.创建和查看表:ht ...
- 阿里云卸载自带的JDK,安装JDK完成相关配置
0.预备工作 笔者的云服务器购买的是阿里云的轻量应用服务器,相比于云服务器ECS,轻量应用服务器是固定流量但是网络带宽较高,对于服务器来说,网络带宽是非常昂贵的,而带宽也决定了你的应用访问的流畅度,带 ...
- 重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB
摘要:POLARDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库,其最大的特色是计算节点与存储节点分离,借助优秀的RDMA网络以及最新的块存储技术.POLARDB不但满足 ...
- 给阿里云主机添加swap分区,解决问题:c++: internal compiler error: Killed (program cc1plus)
前言 今天安装spdlog,一个快速得C++日志库,按照文档步骤,不料出现了一堆错误,像c++: internal compiler error: Killed (program cc1plus)等一 ...
- 阿里云服务器CentOS7怎么分区格式化/挂载硬盘
一.在阿里云上购买了服务器的硬盘后就可以操作了,先看看硬盘情况: 硬盘vda是系统盘:vdb是在阿里云后台购买的另一块硬盘. 第一次使用要分区:fdisk /dev/vdb1 在提示符下依次输入:n+ ...
随机推荐
- [转]Android监听ListView里Button事件
本文转自:http://blog.csdn.net/lovediji/article/details/6753349 public View getView(int position, View co ...
- WPF PasswordBox MVVM 实现
由于PasswordBox.Password属性非依赖属性,所以不能作为绑定的目标,以下是本人的MVVM实现方法. PasswordBox.Password与TextBox.Text同步,TextBo ...
- Spring.net(v1.3.2) 官网API-第一章 前言
虽然有很好的工具和技术,但是开发软件应用仍然是很困难的.Spring为构建企业级应用提供了一个轻量级的解决方案,Spring提供了一个统一的.透明的方式去配置你的应用,和将AOP集成到你的软件中.Sp ...
- CSS——display:flex
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 设为Flex布局以后,子元素的float.clear和vertical-align属性 ...
- java_io学习_编码
package io; public class encodingDemo{ public static void main(String[] args) throws Exception{ // T ...
- Learning opencv续不足(七)线图像的设计D
因为线图像startline有了起点和终点,我们就可以用DDA法求出线上所有点,任意斜率直线通过四象限八区域查表法界定.我们只示范一个区域:函数为: public PointF DdaFindPtIm ...
- 我的FPGA
转眼间我都工作三个年头了,这两年多时间我一直从事着FPGA测试工作,从一开始的懵懂无知,到现在的些许理解,我想记录和分享我对FPGA测试的理解. 之所以选择在博客园写这样,是我发现在这里阅览文章不需要 ...
- Array.prototype.slice.call()的理解
最近在看廖雪峰的JS课程,浏览器中的操作DOM的那一章,有这样一道题. JavaScript Swift HTML ANSI C CSS DirectX <!-- HTML结构 --> & ...
- POJ3984——迷宫问题
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31616 Accepted: 18100 Descriptio ...
- 32.修改IK分词器源码来基于mysql热更新词库
主要知识点, 修改IK分词器源码来基于mysql热更新词库 一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...